假設這是我在資料庫中一個表中的資料
。...
01/01/2016 00。 00 367. 264768801/06/2016 12。 30 739. 8067639 < 包括這個
01/01/2018 03: 00 412. 968613701/01/2018 03。 30 150. 606804601/01 2018 04: 00 79. 2220456801/01/2018 04。 30 648. 702222;/span>
01/01/2018 09。 00 75. 4193136501/01/2018 09。 30 923. 943581201/01/2018 10: 00 342. 911600402/01/2018 02。 00 776. 4855197 < 包括這個
08/04/2021 02: 30 206. 206693302/01/2022 03。 00 852. 987473502/01/2022 03。 30 586. 081820702/01/2022 04。 00 363. 539461302/01/2023 04: 30 874. 3073237
這是我用來獲取資料的查詢
SELECT * FROM MYTABLE WHERE [DATETIME] > = '2018/01/01 03: 00' AND [DATETIME] < '2018/01/01 11:00'
我還希望查詢能在這個范圍之前和之后回傳一個日期,所以像日期填充一樣。
現在,我怎樣才能有效地做到這一點。一種方法是在范圍內獲取日期,然后獲取所有小于最小日期的資料,并獲取其中最高的日期時間,然后添加到主范圍表中,同時對最大日期重復這一程序。
uj5u.com熱心網友回復:
你可以使用lead()和lag():
SELECT *
FROM (SELECT t.*,
LAG(DATETIME, 1, DATETIME) OVER (ORDER BYDATETIME) as PREV_DATETIME,
LEAD(DATETIME, 1, DATETIME) OVER (ORDER BYDATETIME) as NEXT_DATETIME
FROM MYTABLE t
) t
WHERE NEXT_DATETIME >= '2018-01-01 03:00:00' AND
PREV_DATETIME <= '2018-01-01 10:00:00'
注意:這使用默認值來簡化邏輯。
這里是一個db<>fiddle。 根據你指定的結果,我把最后的比較從<=改為<。
uj5u.com熱心網友回復:
Lag和lead是視窗函式,用于獲取其磁區內任何行的前一個和后一個值。因此,當我們想在該范圍之外的行上加墊,我們可以在lag和lead函式中設定偏移引數。
SELECT t.Datetime,t.val FROM (SELECT T. *,LAG(Datetime,1, Datetime) over (order by Datetime) as Lagdate, lead(Datetime,1, Datetime)over(order by Datetime) as leaddate FROM Mytable T) t
WHERE leaddate>= '2018/01/01 03: 00' and lagdate<='2018/01/01 11:00'
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/311054.html
標籤:
下一篇:回傳一列的總行數
