簡體   English   中英

減去上一行以計算 MS SQL 中的列值

[英]Subtract previous row to calculate column value in MS SQL

我有以下數據,需要對其進行格式化以僅顯示連續天數而不會中斷。

例如,我想顯示日期從2018-06-182018-06-21的記錄,因為這些是連續的天數。 但是我不想顯示日期為2018-06-272018-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 天

請注意,查詢實際上並不使用列daymonthyear 這些看起來像派生值,可以在需要時輕松即時計算。 通常,我們使用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.

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