SQL在30天分区中重新读取

时间:2013-04-15 21:34:54

标签: sql-server sql-server-2008 tsql

我正在尝试对在单独的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

2 个答案:

答案 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中每行的数据的所有二级录取。

今晚晚些时候,我可能有时间再看一遍。