考虑此表结构。
Key ID VISITDATE
1 1 2011-01-07
2 1 2011-01-09
3 2 2011-01-10
4 1 2011-01-12
5 3 2011-01-12
6 1 2011-01-15
7 2 2011-01-21
9 1 2011-02-28
10 2 2011-03-21
11 1 2011-01-06
我需要获取所有ID,Key,min(VisitDate),其中VisitDate在10天内?如果您在10天内有两次访问,则结果中需要有一行。
结果
KEY ID VISITDATE
11 1 2011-01-06
3 2 2011-01-10
5 3 2011-01-12
7 2 2011-01-21
9 1 2011-02-28
10 2 2011-03-21
这可以在没有自我加入的情况下完成。我有一个查询,它与ID上的表自我连接并检查datediff.is有更好的解决方案吗?我们可以在这里使用递归CTE吗?
修改
首选可以使用日期列索引的解决方案
答案 0 :(得分:2)
是的,CTE可以很好地解决这个问题(我最近的一切都是CTE ......)
;WITH TenDayVisits
AS (
SELECT
ID
,MIN(VisitDate) AS VisitDate
FROM Visits
GROUP BY ID
UNION ALL
SELECT
t.ID
,v.VisitDate
FROM Visits AS v
JOIN TenDayVisits AS t ON v.ID = t.ID
AND DATEDIFF(dd,t.Visitdate,v.VisitDate) > 10
)
SELECT
DISTINCT
v.[key]
,t.id
,t.VisitDate
FROM TenDayVisits as T
JOIN Visits AS v ON t.id = v.id
AND t.VisitDate = v.VisitDate