2016-10-11 4 views
1

Dense_Rank учитывает все. Есть ли способ, чтобы исключить нулевые значения, так что следующий ранг после 1 будет 2, а не 3.Исключить нулевые значения, используя DENSE_RANK

Это то, что таблица выглядит сейчас:

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

Это то, что я хочу, чтобы таблица выглядеть так:

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

Я использую следующий код, чтобы сделать это: -

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 

ответ

3

Используйте partition by тот же **Condition**, как вы использовали уже.

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

Я думаю, вам нужен дополнительный набор '(' ')' для всего случая. – Hogan

+0

№ Просто проверено. Они не нужны. – GriGrim

+1

Сладкий! Отсроченный гораздо труднее читать, но сладко. – Hogan

2

Вы можете использовать case так:

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

Когда A является нулевым, что происходит с данными, возвращаемыми? –

+0

Прошу прощения, я не ответил правильно, пожалуйста, вернитесь и взгляните на изменения. A никогда не является нулевым, «Свой Dense_R, вызывающий проблему – kage77

+0

@RossBush Nothing. 'dr' будет' null', потому что не упоминается 'else'. – GriGrim

Смежные вопросы