按列中的日期范围分组

nor*_*tos 5 sql-server sql-server-2008-r2

我有一个数据表:

ID    Action    Date
1     Action1   2014-01-20
2     Action1   2014-01-22
3     Action1   2014-01-28
4     Action2   2014-01-20
5     Action2   2014-01-22
6     Action2   2014-01-28
Run Code Online (Sandbox Code Playgroud)

我需要按日期分组,以 3 天的差异分组:

Action       Count
Action1      2
Action2      2
Run Code Online (Sandbox Code Playgroud)

如果一条记录与以前的记录分组,则它不会在另一个组中:

ID    Action    Date
1     Action1   2014-01-20
2     Action1   2014-01-23
3     Action1   2014-01-24

Action       Count
Action1      2
Run Code Online (Sandbox Code Playgroud)

我的解决方案:

SELECT T1.Action, DATEDIFF(DAY,T1.Date,T2.Date) as Count
FROM Table T1
JOIN Table T2 ON T1.Action=T2.Action
WHERE DATEDIFF(DAY,T1.Date,T2.Date) BETWEEN 1 AND 3
GROUP BY T1.Action,T1.Date,T2.Date
Run Code Online (Sandbox Code Playgroud)

这是正确的解决方案吗?

ype*_*eᵀᴹ 6

在 SQL-Server 2012 版本中,LAG()函数看起来很简单:

SELECT
    Action,
    Number = COUNT(*) 
FROM
    ( SELECT 
          Action, 
          Diff = DATEDIFF(day, LAG(Date) OVER (PARTITION BY Action ORDER BY Date), Date)  
      FROM
          a
    ) AS t
WHERE 
    Diff > 3 OR Diff IS NULL
GROUP BY 
    Action ;
Run Code Online (Sandbox Code Playgroud)

即使在 2008 版本中,这也应该有效:

SELECT
    Action,
    Number = COUNT(*) 
FROM
    a
WHERE 
    NOT EXISTS 
    ( SELECT *
      FROM a AS b
      WHERE b.Action = a.Action
        AND ( (b.Date >= DATEADD(day, -3, a.Date) AND b.Date < a.Date)
           OR (b.Date = a.Date AND b.ID < a.ID)
            )
    ) 
GROUP BY 
    Action ;
Run Code Online (Sandbox Code Playgroud)