2012-03-14 68 views
1

我运行一个查询,并得到下面的结果重启ROWNUMBER根据具体的情况

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 

DATA

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 

我怎样才能进一步使分区并分配行号基于序列值, 例如我想重新启动rownumber每次第一次在同一组HOSPcode,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

欢迎使用StackOverflow。请记住,SO赞赏是upvotes和接受的答案。我会强烈建议您仔细阅读[常见问题解答]以获取关于该网站的更多基本信息,尤其是[FAQ#HowToAsk]如何询问 – 2012-03-14 05:45:00

+1

当您通过[HOSP_CODE],[MRN]'分区时,所有行在同一个分区中将会在这些列中具有相同的值 - 那么为什么你将它们包含在'ORDER BY'中呢? – 2012-03-14 08:00:50

+0

所有这些“First”,“Middle”,“Final”值似乎都没有太大意义,它可能足以只有一个'RestartsTheSequence位'列:'1' =序列重新启动,'0 ' - 序列继续。 – 2012-03-14 08:03:11

回答

2

你应该能够做到这一点一recursive CTE

你会想要做的ROWNUMBER递归(这将确保你结束),然后不断递增您改乘新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