2016-11-21 85 views
0

我道歉,如果我不是措辞的问题正确的,这就是为什么我无法找到任何先前的问题/这个答案.....计数基于“为”日期

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

我有一个表格,其中包含医院系统中病人的床位分配记录。病人在床上的位置标有日期,以及他们在那里放置的原因。

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 

但是当改变“为”日期16年4月1日,我希望看到以下内容:

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或服务器? (我的真实记录集约为3600行,可以追溯到15年)。而且我的最终目标是确定每个“医院”的“理由”的年平均值,但我知道第一步是先确定这些初始计数(或者是?)。

+2

您只有1条记录的日期为4/1/2016或更大。为什么其他记录显示?有没有“截止日期”或什么的? – xQbert

+0

当您从3/15到4/15的日期增加时,为什么(HOSP1,原因A)的计数从2降到1? – DVT

+1

@xQbert我*认为*的想法是,你必须看看日期*小于*等于2016年4月15日(或4/1/2016,这个问题同时使用),但它仍然没有'对我来说没有意义。结果表明,“1234 | HOSP1 | 111 | A | 1/1/2016”记录不再计算在内,但我不清楚为什么它不应该被计数。是不是只是在同一张床上有新的记录?这是否意味着床每天都在使用 - 只有下一位患者才能清除床位?我当然希望不是这样。 – hvd

回答

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; 
+0

如果我正确地理解了这个问题(可疑),我想你可能想在外部查询中添加一个WHERE seqnum = 1。感谢你的回答。 – DVT

+0

@DVT。 。 。谢谢。 –

+0

@GordonLinoff真棒,谢谢!!!!! – nicbjones