2016-10-11 1 views
1

Dense_Rank berücksichtigt alles. Gibt es eine Möglichkeit, die Nullwerte ausschließen, so dass der nächste Rang nach 1 2 sein würde und nicht 3.NULL-Werte mit DENSE_RANK ausschließen

Dies ist, was die Tabelle jetzt aussieht:

A  | DENSE_R 
-------------- 
1  | 1 
-------------- 
2  | null 
-------------- 
3  | 3 
-------------- 
4  | 4  

Das ist das, was ich den Tisch will wie folgt aussehen:

A  | DENSE_R 
-------------- 
1  | 1 
-------------- 
2  | null 
-------------- 
3  | 2 
-------------- 
4  | 3 

ich den folgenden Code bin mit, dies zu tun: -

WITH CTE AS 
(
SELECT A 
FROM A1 
) 
SELECT A, 
CASE 
    WHEN **Condition** 
    THEN DENSE_RANK() OVER (Order by [A] ASC) 
END 
AS 'DENSE_R' 
FROM CTE 

Antwort

3

Verwenden partition by die gleiche **Condition** wie Sie bereits verwendet.

WITH CTE AS 
(
SELECT A 
FROM A1 
) 
SELECT A, 
CASE 
    WHEN **Condition** 
    THEN DENSE_RANK() OVER (Partition by (case when **Condition** then 1 else 0 end) Order by [A] ASC) 
END 
AS 'DENSE_R' 
FROM CTE 
+0

Ich denke, Sie brauchen eine zusätzliche Menge von '(' ')' rund um den Fall. – Hogan

+0

Nein. Nur überprüft. Sie werden nicht benötigt. – GriGrim

+1

Süß! Def. viel schwerer zu lesen, aber süß. – Hogan

2

Sie könnenverwendenwie folgt aus:

select A, 
     (case when A is not null 
      then dense_rank() over (partition by (case when A is not null then 1 else 0 end) 
            order by a desc 
            ) 
     end) as dr 
from A1; 
+0

Wenn A null ist, was passiert mit den Daten zurückgegeben? –

+0

Es tut mir leid, dass ich die Frage nicht richtig gestellt habe. Bitte gehen Sie zurück und schauen Sie sich die Änderungen an. A ist nie null, 'Its the Dense_R, das das Problem verursacht – kage77

+0

@RossBush Nichts. "dr" wird "null" sein, weil dort kein "sonst" erwähnt wird. – GriGrim