sql - 对组中上次更新的数据求和
问题描述
因此,我们有一个表格,我们在其中存储了几个房间每小时的预测噪音水平,以及做出预测的时间。
但是这个预测一天可以改变好几次,当这种情况发生时,我们会在表中添加一个新行,以保留历史记录,所以我们有这样的东西:
+----+----+-------+--------+------+-------+---------------------+
| 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 |
+---------+--------+-------+-------------------+
是否可以使用单个查询?
预先感谢您的帮助!
解决方案
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;
推荐阅读
- r - 如何向 geom_density 图表添加渐变填充
- javascript - 为 Packed Bubble Highcharts 中的每个气泡添加标题
- javascript - 根据超链接文本中的最后一个单词更改背景
- powershell - 将变量合并到一个对象
- docusignapi - 如何在 DocuSign 中插入货币字段?
- react-native - 更新由 RCTView 管理的视图的属性“accessibilityRole”时出错
- mysql - 更新重复记录中的最新记录
- docker - 无法从外部客户端连接到 kafka docker 容器(wurstmeister 图像)
- angular - Primeng p-dropdown 是不是按照组名过滤的?
- c# - Convert.ToDecimal 不转换输入的十进制数