[英]Get value from previous hour and subtract from current value in SQL
我需要從前一小時 max(date) 的級別值中減去級別值,但我對如何獲取最后一條記錄並按小時減去它感到困惑。
我的表記錄是這樣的:
SNO | Date | ID | Level
1 | 2021-01-13 00:07:44.190 | 1021 | 56.29
2 | 2021-01-13 00:33:44.190 | 1022 | 84.29
3 | 2021-01-13 00:35:44.190 | 1021 | 54.29
4 | 2021-01-13 00:43:44.190 | 1021 | 53.29
5 | 2021-01-13 00:47:44.190 | 1022 | 82.29
6 | 2021-01-13 01:07:44.190 | 1021 | 52.93
7 | 2021-01-13 01:33:44.190 | 1022 | 82.29
8 | 2021-01-13 01:43:44.190 | 1021 | 47.29
9 | 2021-01-13 01:47:44.190 | 1022 | 79.29
10 | 2021-01-13 02:07:44.190 | 1021 | 44.29
11 | 2021-01-13 02:33:44.190 | 1022 | 77.29
現在我需要做的是我需要每個小時的 max(date) 根據 ID 其結果是這樣的:
SNO | Date | ID | Level | Level_2
3 | 2021-01-13 00:43:44.190 | 1021 | 53.29 | <-- Level from previous last hour or 0 -->
4 | 2021-01-13 00:47:44.190 | 1022 | 82.29 | <-- Level from previous last hour or 0 -->
7 | 2021-01-13 01:43:44.190 | 1021 | 47.29 | 54.29
8 | 2021-01-13 01:47:44.190 | 1022 | 79.29 | 82.29
9 | 2021-01-13 02:07:44.190 | 1021 | 44.29 | 47.29
10 | 2021-01-13 02:33:44.190 | 1022 | 77.29 | 79.29
請分享這種情況的可能結果,如果需要,您可以詢問更多信息。
要獲得您想要的結果,您可以過濾到每小時的最后一行,然后使用lag()
:
select t.*,
lag(level) over (partition by id order by date) as prev_level
from (select t.*,
row_number() over (partition by id
order by convert(date, date), datepart(hour, date) order by date desc
) as seqnm
from t
) t
where seqnum = 1;
注意:這假設您每小時都有數據。
另一種方法是查看下一個日期,看看它是否在同一小時內。
另一種獲取每小時數據的方法是使用lead()
:
select t.*
from (select t.*,
lead(date) over (partition by id order by date) as next_date
from t
) t
where next_date is null or
datediff(hour, date, next_date) > 0;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.