因此,我们有一个表格,其中每小时存储几个房间的预测噪声水平,与进行预测的时间相同。
但是此预测一天可能会更改几次,当发生这种情况时,我们将新行添加到表中以保留历史记录,因此我们有如下内容:
+----+----+-------+--------+------+-------+---------------------+
| 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 |
+---------+--------+-------+-------------------+
是否可以使用单个查询?
预先感谢您的帮助!
答案 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;