簡體   English   中英

從前一小時獲取值並從 SQL 中的當前值中減去

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM