Re: [SQL ] 挑選連續不得中斷14天的日期

作者: Mutex (Mutex)   2018-05-01 21:13:02
再次感謝cutekid大大的伸手援助
http://sqlfiddle.com/#!18/458ff/5
WITH TB1 AS (
SELECT ITEMNAME, STARTDATE, ENDDATE,
ROW_NUMBER() OVER (PARTITION BY ITEMNAME ORDER BY STARTDATE) AS NUM
FROM T
),
TB2 AS (
SELECT ITEMNAME, STARTDATE, ENDDATE, NUM
FROM TB1
WHERE NUM = 1
UNION ALL
SELECT T1.ITEMNAME, T1.STARTDATE, T2.ENDDATE, T2.NUM
FROM TB2 T1 INNER JOIN TB1 T2
ON T1.ITEMNAME = T2.ITEMNAME
AND T1.NUM + 1 = T2.NUM
AND DATEDIFF(DAY,T1.ENDDATE,T2.STARTDATE) <= 14
)
SELECT ITEMNAME, MIN(STARTDATE), MAX(ENDDATE)
FROM TB2
GROUP BY ITEMNAME
OPTION (MAXRECURSION 0)
另外有興趣的人
cutekid大建議可以去找CTE的資料來看
WITH common_table_expression (Transact-SQL)
Thanks.
※ 引述《Mutex (Mutex)》之銘言:
: 資料庫名稱:MSSQL
: 資料庫版本:2016
: 內容/問題描述:目前在計算某個物品(ITEMNAME)第一次使用與最後使用的日期
: 但是不同筆的使用紀錄,彼此之間不得超過14天
: 否則後面的資料就都不看
: 就只看前面符合條件的第一次與最後一次日期
: 資料範例如下,我把想要抓出來的日期用*表示:
: ITEMNAME STARTDATE ENDDATE
: A 20160101* 20160330*
: A 20160420 20160720
: A 20160801 20161130
: B 20160101* 20160330
: B 20160407 20160707*
: B 20160801 20161130
: C 20160201* 20160330
: C 20160407 20160707
: C 20160715 20161130*
: D 20160101* 20160330*
: 也就是說,希望可以得到的答案如下:
: A 20160101 20160330
: B 20160101 20160707
: C 20160201 20161130
: D 20160101 20160330
: 忽然想到這個情境,但是卻思索不出個好解法
: 只好來請益,先謝謝高手了

Links booklink

Contact Us: admin [ a t ] ucptt.com