休憩なしで連続した日のみを表示するようにフォーマットする必要がある以下のデータがあります。
たとえば、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
のレコードがありませんでした)。
以下に書きましたが、探している出力を提供できません。どんな助けでも大歓迎です。
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
出力
シーケンスを検索する代わりにこれを使用できます。
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