如果我没有正确地写出问题,我很抱歉,这就是为什么我在此找不到任何先前的问题/答案.....
我的具体情况可以概括为:
我有一张表格,其中包含医院系统患者的床位分配记录。患者躺在床上会被标记日期,并将其放置在那里。
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年前)。我的最终目标是确定每个“医院”的“理由”计数的年平均值,但我知道第一步是首先确定这些初始计数(或者是???)。
答案 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;