对来自组的最后更新的数据求和

时间:2019-06-13 11:16:51

标签: sql sql-server

因此,我们有一个表格,其中每小时存储几个房间的预测噪声水平,与进行预测的时间相同。

但是此预测一天可能会更改几次,当发生这种情况时,我们将新行添加到表中以保留历史记录,因此我们有如下内容:

+----+----+-------+--------+------+-------+---------------------+
| room_id | reference_date | hour | noise |     update_time     |
+----+----+-------+--------+------+-------+---------------------+
|    1    |   2019-06-13   |   8  |    0  | 2019-06-13 07:15:23 |
|    1    |   2019-06-13   |   9  |    5  | 2019-06-13 07:15:23 |
|    2    |   2019-06-13   |   8  |    2  | 2019-06-13 07:15:23 |
|    1    |   2019-06-13   |   8  |    5  | 2019-06-13 08:15:23 |
|    1    |   2019-06-13   |   9  |    5  | 2019-06-13 08:15:23 |
+---------+--------+--------+-----+-------+---------------------+

现在,我们希望对整天的预测噪声水平求和,但仅使用最后一个update_time,否则将在一天的同一小时内有多个条目,而不是一个条目。

我仅尝试了几个示例,但无法通过单个查询使用它,我们正在使用SQL Server 14.0.3030.27。我可以用代码做到这一点,但我相信有一个更好的解决方案。

查询结果应该是这样

+----+----+-------+--------+------+-------+----+
| room_id | reference_date | total_daily_noise |
+----+----+-------+--------+-------------------+
|    1    |   2019-06-13   |        10         |
+---------+--------+-------+-------------------+

是否可以使用单个查询?

预先感谢您的帮助!

1 个答案:

答案 0 :(得分:4)

row_number()是一种获取每小时最新预测的方法:

select room_id, reference_date, sum(noise) as noise
from (select t.*,
             row_number() over (partition by room_id, reference_date, hour order by update_time desc) as seqnum
      from t
     ) t
where seqnum = 1
group by room_id;

另一种方法使用相关的子查询:

select room_id, reference_date, sum(noise) as noise
from t
where t.update_time = (select max(t2.update_time)
                       from t t2
                       where t2.room_id = t.room_id and
                             t2.reference_date = t.reference_date and
                             t2.hour = t.hour
                      )
group by room_id;