2017-06-14 6 views
0

DENSE_RANKの御馳走のNULLははっきり

DECLARE @Table TABLE(
     A INT, 
     B INT, 
     C INT 
) 

INSERT INTO @Table SELECT 1, 1, NULL 
INSERT INTO @Table SELECT 1, 1, NULL 
INSERT INTO @Table SELECT 1, 1, 1 
INSERT INTO @Table SELECT 1, 1, 2 
INSERT INTO @Table SELECT 1, 1, 2 
INSERT INTO @Table SELECT 1, 1, 2 
INSERT INTO @Table SELECT 1, 2, 1 
INSERT INTO @Table SELECT 1, 2, 2 
INSERT INTO @Table SELECT 2, 1, NULL 
INSERT INTO @Table SELECT 2, 1, NULL 
INSERT INTO @Table SELECT 2, 1, 1 
INSERT INTO @Table SELECT 2, 2, 1 
INSERT INTO @Table SELECT 2, 2, 1 
INSERT INTO @Table SELECT 2, 2, NULL 

SELECT A, B, C, DENSE_RANK() OVER (ORDER BY A,B,C DESC) AS rank 
FROM @Table 

を考えると、結果は次のとおりです。

A B C rank 
1 1 2 1 
1 1 2 1 
1 1 2 1 
1 1 1 2 
1 1 NULL 3 
1 1 NULL 3 
1 2 2 4 
1 2 1 5 
2 1 1 6 
2 1 NULL 7 
2 1 NULL 7 
2 2 1 8 
2 2 1 8 
2 2 NULL 9 

私は1 1 NULL2 1 NULLのインスタンスが別々のランクになりたいです。私は、NULL値を未知の値で扱い、ヌルを一緒にグループ化しないように扱いたい。

許容答えはNULL値が先頭または末尾にある場合、私は気にしない

A B C rank 
1 1 2 1 
1 1 2 1 
1 1 2 1 
1 1 1 2 
1 1 NULL 3 
1 1 NULL 4 
1 2 2 5 
1 2 1 6 
2 1 1 7 
2 1 NULL 8 
2 1 NULL 9 
2 2 1 10 
2 2 1 10 
2 2 NULL 11 

可能性があり、それがあります。私は実際に物事をランキングしていません。私はDENSE_RANKを各グループに一意の番号を付ける手段として使用しています。

私は、SQLサーバーに2014

+0

私は1つの1 NULLを見ています=ランク3;一方、2 1 NULL =ランク7です。それらは区別されませんか? – Greenspark

+0

いいえ、DENSE_RANKはNULLを同じものとして扱います - したがって問題です – CuriousDeveloper

答えて

1

を使用しています。少なくとも、あなたはCがnullの場合に一意の値を取得するダミー列を追加することで、このようにそれを行うことができます。

SELECT A, B, C, DENSE_RANK() OVER (ORDER BY A,B,C DESC, dummy) AS rank 
FROM (
    select *, case when C is null then row_number() over (order by (select null)) end as dummy 
    from @Table 
) X 
関連する問題