Перезапуск номера в зависимости от условий - PullRequest
1 голос
/ 14 марта 2012

Я выполняю один запрос и получаю следующие результаты

Select *
from 
(Select ROW_NUMBER() over 
    (partition by [HOSP_CODE],[MRN] 
    order by [HOSP_CODE],MRN,ADM_DATETIME ) as rownumber,* 
from Live.tempnewbornbundling) as a
order by [HOSP_CODE],MRN,ADM_DATETIME

ДАННЫЕ

Rownumber key     MRn    hospcode adm_date         sep_date         Sequence
--------- ------- ------ -------- ---------------- ---------------- --------
1         7099222 544607 3        22/07/2011 04:55 22/07/2011 10:44 First
2         7099223 544607 3        22/07/2011 10:45 25/07/2011 19:43 Middle
3         7099224 544607 3        25/07/2011 19:44 26/07/2011 11:29 Middle
4         7099225 544607 3        27/07/2011 12:30 27/07/2011 19:30 First
5         7099226 544607 3        27/07/2011 19:31 28/07/2011 19:31 Final
1         7099227 559282 3        03/07/2011 22:50 03/07/2011 23:51 First
2         7099228 559282 3        03/07/2011 23:52 04/07/2011 15:30 Middle
3         7099229 559282 3        04/07/2011 15:31 04/07/2011 17:59 Final
4         7099230 559282 3        05/07/2011 18:00 05/07/2011 18:05 First
5         7099231 559282 3        05/07/2011 18:06 09/07/2011 14:58 Final

Как дополнительно создать разделы и назначить номера строк на основе значений последовательности, например, я хочудля перезапуска номера каждый раз, когда в этой же группе первый HOSP-код, MRN

Rownumber key     MRn    hospcode adm_date         sep_date         Sequence New rownumber
--------- ------- ------ -------- ---------------- ---------------- -------- -------------
1         7099222 544607 3        22/07/2011 04:55 22/07/2011 10:44 First    1
2         7099223 544607 3        22/07/2011 10:45 25/07/2011 19:43 Middle   2
3         7099224 544607 3        25/07/2011 19:44 26/07/2011 11:29 Middle   3
4         7099225 544607 3        27/07/2011 12:30 27/07/2011 19:30 First    1
5         7099226 544607 3        27/07/2011 19:31 28/07/2011 19:31 Final    2
1         7099227 559282 3        03/07/2011 22:50 03/07/2011 23:51 First    1
2         7099228 559282 3        03/07/2011 23:52 04/07/2011 15:30 Middle   2
3         7099229 559282 3        04/07/2011 15:31 04/07/2011 17:59 Final    3
4         7099230 559282 3        05/07/2011 18:00 05/07/2011 18:05 First    1
5         7099231 559282 3        05/07/2011 18:06 09/07/2011 14:58 Final    2

1 Ответ

2 голосов
/ 14 марта 2012

Вы должны быть в состоянии сделать это с рекурсивным CTE

. Вы захотите выполнить рекурсию по ряду (это обязательно завершится), а затем просто продолжать увеличиватьновый столбец rownumber каждый раз, когда вы повторяете, сбрасывается при первом ударе.Я считаю, что ответ ниже должен работать.Я бы сохранил предыдущий запрос во временной таблице

WITH FinalValues (RowNumber, Key, MRN, HospCode, adm_date, sep_date, 
    sequence, NewRowNum)
AS
(
-- Anchor member definition
SELECT RowNumber, Key, MRN, HospCode, adm_date, sep_date, 
    sequence, 1 AS NewRowNum
FROM PreviousQuery
WHERE RowNumber = 1
UNION ALL
-- Recursive member definition
SELECT P.RowNumber, P.Key, P.MRN, P.HospCode, P.adm_date, P.sep_date, 
    P.sequence, 
    CASE WHEN P.sequence = 'First' THEN 1 ELSE NewRowNum + 1 END AS NewRowNum
FROM PreviousQuery AS P
INNER JOIN FinalValues 
    ON FinalValues.RowNumber = P.RowNumber + 1
)
-- Statement that executes the CTE
SELECT *
FROM FinalValues;
GO
...