Sql 基于“截止日期”的计数

Sql 基于“截止日期”的计数,sql,tsql,Sql,Tsql,如果我的问题措辞不正确,我深表歉意,这就是为什么我以前找不到关于这个问题的任何问题/答案 我的具体情况可以概括为: 我有一张表格,里面有医院系统中病人的床位分配记录。患者在床上的位置标有日期和放置原因 Patient |Hospital |Bed |Reason |Date --------|---------|----|-------|-------- 1234 |HOSP1 |111 |A |1/1/2016 5678 |HOSP1 |222 |A

如果我的问题措辞不正确,我深表歉意,这就是为什么我以前找不到关于这个问题的任何问题/答案

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

我有一张表格,里面有医院系统中病人的床位分配记录。患者在床上的位置标有日期和放置原因

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
但将截止日期更改为2016年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年前。我的最终目标是确定每家医院每年的原因计数平均值,但我知道第一步是首先确定这些初始计数,还是???

你想要的是某个日期之前的最新记录。使用窗口函数很容易做到这一点:

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;

您需要的是特定日期之前的最新记录。使用窗口函数很容易做到这一点:

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;

您只有一份日期为2016年4月1日或更高的记录。为什么其他记录会显示?有截止日期吗?为什么当您将截止日期从3/15增加到4/15时,HOSP1的计数会从2下降到1?@xQbert我认为这个想法是,您必须查看小于或等于4/15/2016或4/1/2016的日期,这两个问题都使用,但对我来说仍然没有意义。结果表明,2016年1月1日的1234 | HOSP1 | 111 | A |记录不再被计算在内,但我不清楚为什么它不应该被计算在内。仅仅是因为同一张床有更新的记录吗?这是否意味着每天都在使用这张床?除非有下一个病人,否则床无法清理?我当然希望不是这样。您只有一张日期为2016年4月1日或更高的记录。为什么其他记录会显示?有截止日期吗?为什么当您将截止日期从3/15增加到4/15时,HOSP1的计数会从2下降到1?@xQbert我认为这个想法是,您必须查看小于或等于4/15/2016或4/1/2016的日期,这两个问题都使用,但对我来说仍然没有意义。结果表明,2016年1月1日的1234 | HOSP1 | 111 | A |记录不再被计算在内,但我不清楚为什么它不应该被计算在内。仅仅是因为同一张床有更新的记录吗?这是否意味着每天都在使用这张床?除非有下一个病人,否则床无法清理?我当然希望不是这样。如果我正确理解了这个问题,我想您可能希望在外部查询中添加一个WHERE seqnum=1。谢谢你的回答。@DVT。谢谢。如果我正确理解了这个问题,我想您可能需要在外部查询中添加一个WHERE seqnum=1。谢谢你的回答。@DVT。非常感谢。