是连续日期
问题描述:
我有一张简单的表格来表示客户编号以及他们何时进行购买。我需要知道任何特定客户何时在连续日期购买以及这些日期是什么。连续日期的数量无关紧要。是连续日期
在这个例子中+----------+--------+ | Customer | Date | +----------+--------+ | 123 | 21-Jan | | 123 | 24-Jan | | 345 | 21-Jan | | 345 | 23-Jan | | 345 | 24-Jan | | 123 | 26-Jan | | 123 | 27-Jan | +----------+--------+
我需要返回以下
所以:
+----------+--------+ | Customer | Date | +----------+--------+ | 123 | 26-Jan | | 123 | 27-Jan | | 345 | 23-Jan | | 345 | 24-Jan | +----------+--------+
答
这是一个修改的缺口和孤岛问题。一种解决方案是使用ROW_NUMBER
:
WITH Cte AS(
SELECT *,
grp = DATEADD(DAY, -ROW_NUMBER() OVER(PARTITION BY Customer ORDER BY Date), Date)
FROM tbl
),
CteFinal AS(
SELECT *,
cnt = COUNT(Customer) OVER(PARTITION BY Customer, grp)
FROM Cte
)
SELECT
Customer, Date
FROM CteFinal
WHERE cnt > 1
答
尝试像
SELECT DISTINCT Customer , [Date]
FROM Table T
WHERE
Exists(SELECT 1 FROM Table WHERE [Date] = DATEADD(day,1,T.Date) OR [Date] = DATEADD(day, -1,T.Date))
你需要的,如果它包含您的日期格式正确时间