2015-05-13 3 views
2

Я хотел бы, чтобы генерировать порядковый номер, который пропускает нулевые значения (т.е. нулевые значения не учитываются):Сформировать порядковый номер, пропуск пустых значений

PAT_ID ENC_DATE SEQ 
------ -------- --- 
1  null  null 
1  05/01/15 1 
2  01/01/14 1 
2  null  null 
2  02/11/14 2 

В настоящее время:

SELECT PAT_ID, ENC_DATE 
     ,case when enc_date is not null then ROW_NUMBER() OVER (PARTITION BY pat_id ORDER BY end_date) end SEQ 

Формирует (нулевое значение увеличивает значение SEQ):

PAT_ID ENC_DATE SEQ 
------ -------- ---- 
1  null  null 
1  05/01/15 2 
2  01/01/14 1 
2  null  null 
2  02/11/14 3 

Что мне не хватает?

+2

К сожалению, мне что-то не хватает? Вы уже пропустили нулевые значения и сгенерировали последовательность. –

ответ

2

Вы можете добавить NULL чека в PARTITION BY:

SELECT PAT_ID, ENC_DATE 
     ,CASE WHEN enc_date IS NOT NULL 
       THEN ROW_NUMBER() OVER (PARTITION BY pat_id,CASE WHEN Enc_Dt IS NULL THEN 1 END ORDER BY end_date) 
     END SEQ 
     ,dense_rank() OVER (PARTITION BY pat_id ORDER BY enc_date) DR 
1

Похоже, вы хотите иметь нулевые даты считаются последним:

SELECT PAT_ID, ENC_DATE 
,case when enc_date is not null 
    then ROW_NUMBER() OVER (PARTITION BY pat_id ORDER BY ISNULL(enc_date, '2079-06-05T23:59:00')) end SEQ 
,dense_rank() OVER (PARTITION BY pat_id ORDER BY ISNULL(enc_date, '2079-06-05T23:59:00')) DR 
from t; 

Результат:

PAT_ID ENC_DATE SEQ  DR 
1  2015-05-01 1  1 
1  (null)  (null) 2 
2  2014-01-01 1  1 
2  2014-02-11 2  2 
2  (null)  (null) 3 
+0

Есть ли константа SQL Server, представляющая максимальное значение даты? Если да, то имеет смысл использовать его вместо '2079-06-05T23: 59: 00'? – craig

+1

@Craig, это значение представляет собой максимально допустимую дату, которую вы можете использовать с 'smalldatetime' - см. [Здесь] (https://msdn.microsoft.com/en-us/library/ms186724.aspx). Скорее всего, Марк использует это, чтобы убедиться, что вы не получаете ошибку вне диапазона, если ваше значение 'ENC_DATE' набирается как' smalldatetime', так как 'ISNULL()' наследует тип данных первого переданного ему значения , или по образцу, который он разработал для использования с этим типом данных. – AHiggins

+0

Поле 'ENC_DATE' -' datetime'. – craig

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