如何按日期分组进行分组?

时间:2011-10-06 20:36:00

标签: sql sql-server-2008 common-table-expression

考虑此表结构。

 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吗?

修改

首选可以使用日期列索引的解决方案

1 个答案:

答案 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
相关问题