2016-11-20 16 views
0

私はfloat値のテーブルを持っています。 PERCENT_RANK()を使用してこれらの値のサブセット(A)を使用してランクを作成したいとします。次に、最初のサブセット(A)から派生したランクに基づいて、テーブル内の値の第2の(交差しない)サブセット(B)にランクを割り当てる必要があります。サブセット(B)の値は一般的にサブセット(A)の値と等しくないので、単に(B)から(A)の値を結合することはできません。その場合、ランクを取得するために、「最も近い値」アプローチまたは「直線補間」アプローチのいずれかを使用しても問題ありません。私は何十万行も処理しているので、私の好みはスピードとシンプルさです。SQLで別のデータセットを使用して1つのデータセットをランク付けする方法は?

ここで(FLAG = 0と部分集合Bがどこにある部分集合Aを想定あるフラグ= 1)の具体例である:

DECLARE @Data TABLE 
(
    Value FLOAT, 
    Flag BIT 
) 
INSERT INTO @Data SELECT 0.081, 0 
INSERT INTO @Data SELECT 0.831, 0 
INSERT INTO @Data SELECT 0.798, 0 
INSERT INTO @Data SELECT 0.722, 0 
INSERT INTO @Data SELECT 0.322, 0 
INSERT INTO @Data SELECT 0.186, 0 
INSERT INTO @Data SELECT 0.494, 0 
INSERT INTO @Data SELECT 0.757, 0 
INSERT INTO @Data SELECT 0.996, 0 
INSERT INTO @Data SELECT 0.146, 0 
INSERT INTO @Data SELECT 0.514, 1 
INSERT INTO @Data SELECT 0.787, 1 
INSERT INTO @Data SELECT 0.125, 1 
INSERT INTO @Data SELECT 0.324, 1 
INSERT INTO @Data SELECT 0.86, 1 
--Subset A 
SELECT *, 
    Rnk = PERCENT_RANK() OVER (ORDER BY Value) 
FROM @Data 
WHERE Flag = 0 
--Subset B 
SELECT *, 
    Rnk = ?--Ranking based on ranks derived from subset A 
FROM @Data 
WHERE Flag = 1 
+0

この[リンク](http://sqlmag.com/t-sql/last-non-null-puzzle)非常に高速なソリューションへの束を私を助けてしまった:これは、1つの方法です。 – Joe

答えて

1

うーん。 。 。

with a as (
     select d.* 
      PERCENT_RANK() OVER (ORDER BY Value) as rnk 
     from @Data d 
     where Flag = 0 
    ) 
select b.*, a.rnk 
from @Data b outer join 
    (select top 1 * 
     from a 
     where a.value <= b.value 
     order by a.value desc 
    ) a 
where Flag = 1; 
関連する問題