web-dev-qa-db-ja.com

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-12018-6-32018-6-4のシーケンスは壊れているため非表示にする必要があります(テーブルに2018-6-2のレコードがありませんでした)。

以下に書きましたが、探している出力を提供できません。どんな助けでも大歓迎です。

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

enter image description here

出力

enter image description here

4
codeninja

シーケンスを検索する代わりにこれを使用できます。

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
0
VarunT