根据“截至日期”计算

时间:2016-11-21 18:35:53

标签: sql tsql

如果我没有正确地写出问题,我很抱歉,这就是为什么我在此找不到任何先前的问题/答案.....

我的具体情况可以概括为:

我有一张表格,其中包含医院系统患者的床位分配记录。患者躺在床上会被标记日期,并将其放置在那里。

Patient |Hospital |Bed |Reason |Date
--------|---------|----|-------|--------
1234    |HOSP1    |111 |A      |1/1/2016
5678    |HOSP1    |222 |A      |2/1/2016
9012    |HOSP2    |333 |B      |3/1/2016
3456    |HOSP3    |444 |C      |3/1/2016
2345    |HOSP3    |555 |A      |3/1/2016
7890    |HOSP1    |111 |D      |4/1/2016

基于上面非常小的样本集,我需要计算每个医院的“原因”,给出“截止日期”。因此,鉴于2016年3月15日的“截止日期”:

As of Date: 3/15/2016
Hospital|Reason   |Count
--------|---------|-----
HOSP1   |A        |2
HOSP2   |B        |1
HOSP3   |A        |1
HOSP3   |C        |1

但是当将“截至日期”更改为4/1/16时,我希望看到以下内容:

As of Date: 4/15/2016
Hospital|Reason   |Count
--------|---------|-----
HOSP1   |A        |1
HOSP1   |D        |1
HOSP2   |B        |1
HOSP3   |A        |1
HOSP3   |C        |1

有关实现此目的的最佳途径的任何建议,而不会熔化我的CPU或服务器? (我的真实记录是大约36米行,可以追溯到15年前)。我的最终目标是确定每个“医院”的“理由”计数的年平均值,但我知道第一步是首先确定这些初始计数(或者是???)。

1 个答案:

答案 0 :(得分:3)

您想要的是特定日期之前的最新记录。使用窗口函数非常容易:

select hospital, reason, count(*)
from (select t.*,
             row_number() over (partition by hospital, bed order by date desc) as seqnum
      from t
      where date <= '2016-03-15'
     ) t
where seqnum = 1
group by hospital, reason;