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