我正在尝试对在单独的30天窗口内发生的患者再入院进行分组(SQL Server 2008)。 在递归CTE的多次尝试之后,我只是围成一圈。 非常感谢所有帮助。
问题:
如果患者在首次出院后30天内入院,请在第一期内计算所有入院人数(在下面的示例中,2011年7月7日的第二个入院日期在2011年7月20日的窗口内)
在上述30天期限之后的第一次入场应被视为新的30天窗口,并且在出院后30天内的任何承认都将成为第2组等的一部分。
因此,记录3是新30天窗口的开始,即使此承认是在前一记录解除后的30天内(2011年8月5日的承认是在2011年8月26日之前,但是8 / 5/2011大于2011年7月20日开始第30天窗口的终点)。
记录4在2011年8月31日之前被录取,因此它应该被包括在第2组中。
记录5独立,因为它在2011年8月31日结束第2组之后超过30天被录取。
示例记录集的所需输出是每个30天起点的费用总和。
期望的结果:
MRN Admit TotalCharge 555 6/14/2011 $25 555 7/30/2011 $39 555 11/3/2011 $10
记录集示例:
Acct MRN Admit Disc Disch+30 Charge 590 555 6/14/2011 6/20/2011 7/20/2011 15 938 555 7/7/2011 7/27/2011 8/26/2011 10 1011 555 7/30/2011 8/1/2011 8/31/2011 9 1089 555 8/5/2011 9/14/2011 10/14/2011 30 3011 555 11/3/2011 11/23/2011 12/23/2011 10
答案 0 :(得分:2)
看起来我可能有点雄心勃勃,坚持认为这可以通过单通道,基于集合的查询来完成。这非常接近,但仍然将结果转储到#temp表以支持准并行更新(每个MRN值一个“线程”,而不是一次通过一个MRN的游标)。
DECLARE @t TABLE(Acct INT, MRN INT, Admit DATE, Disc DATE, Charge INT);
INSERT @t VALUES
(590 , 555, '20110614','20110620',15),
(938 , 555, '20110707','20110727',10),
(1011, 555, '20110730','20110801', 9),
(1089, 555, '20110805','20110914',30),
(3011, 555, '20111103','20111123',10);
SELECT MRN, [group] = CONVERT(INT, NULL), Admit, Disc, Charge,
rn = ROW_NUMBER() OVER (PARTITION BY MRN ORDER BY Admit),
da = DATEADD(DAY, 30, Disc)
INTO #x FROM @t; -- add a WHERE clause if examining a set in a bigger table
DECLARE @rn INT = 0;
WHILE @rn IS NOT NULL
BEGIN
SELECT @rn = MIN(rn) FROM #x WHERE [group] IS NULL;
UPDATE agg SET [group] = @rn
FROM #x AS agg
INNER JOIN #x AS src
ON agg.MRN = src.MRN
AND agg.Admit <= src.da
AND agg.[group] IS NULL
AND src.rn = @rn;
END
GO
SELECT MRN, Admit = MIN(Admit), TotalCharge = SUM(Charge)
FROM #x GROUP BY MRN, [group];
GO
DROP TABLE #x;
结果:
MRN Admit TotalCharge
--- ---------- -----------
555 2011-06-14 25
555 2011-07-30 39
555 2011-11-03 10
答案 1 :(得分:0)
将日期表自行加入到自身,以确定所有在30天内没有再次入场的入院;调用该关系T1并使其成为主查询的子查询。
现在再次将T1加入数据,以获取T1中每行的数据的所有二级录取。
今晚晚些时候,我可能有时间再看一遍。