[英]SQL Server : calculate column value based on value in previous row/id
[英]Subtract previous row to calculate column value in MS SQL
我有以下數據,需要對其進行格式化以僅顯示連續天數而不會中斷。
例如,我想顯示日期從2018-06-18
到2018-06-21
的記錄,因為這些是連續的天數。 但是我不想顯示日期為2018-06-27
或2018-07-03
的行,因為這些日子沒有序列。 Friday-Monday
例外,會有明顯的差距。 例如,如果日期是2018-06-21
(星期四)、 2018-06-22
(星期五)和2018-06-25
(星期一),那么這將是一個有效的序列。
序列2018-6-1
, 2018-6-3
, 2018-6-4
必須隱藏,因為它被破壞了(表中沒有2018-6-2
的記錄)。
我在下面寫過,但它無法提供我正在尋找的 output。 任何幫助將不勝感激。
select date, diff, Percent_gain, day, month, Year
from (
select date
,datediff(day, '2018-1-29',date) - coalesce(lag(datediff(day, '2018-1-29', date)) over (order by date), 0) as diff
,Percent_gain, day, month, year
from tab
) t1
where t1.diff < 2
and t1.Percent_gain < 0
Output
您可以使用 window 函數和條件表達式:
select *
from (
select t.*, lag(date) over(order by date) lag_date
from mytable t
where percent_gain < 0
) t
where
lag_date is null
or date = dateadd(day, case when datename(dw, date) = 'Monday' then 3 else 1 end, lag_date)
子查詢過濾percent_gain
為負數的行,並使用lag()
檢索“上一個”行的date
。 然后,外部查詢再次根據以下條件進行過濾:
任一行是“第一”行(即沒有前一個日期)
或當前行的日期比前一個日期晚一天 - 如果當前日期是星期一則除外,在這種情況下,當前日期應比前一個日期晚 3 天
請注意,查詢實際上並不使用列day
、 month
和year
; 這些看起來像派生值,可以在需要時輕松即時計算。 通常,我們使用datename()
來獲取日期名稱。
您可以使用它作為查找序列的替代方法。
WITH dates(id ,date)
AS
(
SELECT 1, '2020-03-10' UNION
SELECT 2, '2020-03-15' UNION
SELECT 3, '2020-04-17' UNION
SELECT 3, '2020-04-20' UNION
SELECT 3, '2020-04-21' UNION
SELECT 3, '2020-04-22' UNION
SELECT 4, '2020-04-25'
)
Select A.*,CASE WHEN day_name = 'MONDAY'
THEN CASE WHEN datediff(d,A.prev_date,A.date) = 3
THEN 1
ELSE 0 END
ELSE CASE WHEN datediff(d,A.prev_date,A.date) = 1
THEN 1
ELSE 0 END
END AS Is_seq
from (Select t.*, DATENAME(dw,date) as day_name,
lag(date) over (order by date) as prev_date
from dates t
) A
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.