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)
这是正确的解决方案吗?
在 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)