首页 > 解决方案 > 如何按自定义条件显示每个用户的最新日期范围和过滤周期

问题描述

我有下表结构

UserID | Date
1        2020-01-01
1        2020-01-02
1        2020-01-03
1        2020-02-05
1        2020-02-06
1        2020-03-08
1        2020-03-09
2        2020-01-02
2        2020-01-03
2        2020-01-04
2        2020-01-18
2        2020-01-19
2        2020-01-20
2        2020-02-03
2        2020-02-04
2        2020-02-05
2        2020-02-09
2        2020-02-10
2        2020-02-11
2        2020-02-12
2        2020-02-13
2        2020-02-14
2        2020-02-15
2        2020-02-16
3        2020-01-02
3        2020-01-03
3        2020-03-15
3        2020-03-16
3        2020-03-17
3        2020-03-20
3        2020-03-21

期望的结果:

UserID | Date
1        2020-03-08
1        2020-03-09
2        2020-02-03
2        2020-02-04
2        2020-02-05
2        2020-02-09
2        2020-02-10
2        2020-02-11
2        2020-02-12
2        2020-02-13
2        2020-02-14
2        2020-02-15
2        2020-02-16
3        2020-03-15
3        2020-03-16
3        2020-03-17
3        2020-03-20
3        2020-03-21

所以我需要为每个用户显示最新的日期范围,但如果最后日期范围之间的差异> 7,则需要隐藏这些行。

作为用户 2 的日期示例。

2        2020-01-02
2        2020-01-03
2        2020-01-04
2        2020-01-18
2        2020-01-19
2        2020-01-20
2        2020-02-03
2        2020-02-04
2        2020-02-05
2        2020-02-09
2        2020-02-10
2        2020-02-11
2        2020-02-12
2        2020-02-13
2        2020-02-14
2        2020-02-15
2        2020-02-16

结果将是

2        2020-02-03
2        2020-02-04
2        2020-02-05
2        2020-02-09
2        2020-02-10
2        2020-02-11
2        2020-02-12
2        2020-02-13
2        2020-02-14
2        2020-02-15
2        2020-02-16

用户 2 在 2020 年 2 月 3 日之前的最晚日期是 2020 年 1 月 20 日。它们之间的日期差异超过 7 天,因此需要为用户 2 过滤 2020-02-03 之前的所有行。

提前感谢您的帮助。

标签: sqlsql-server

解决方案


你可以试试这个 - 选项 -

在这里演示

WITH CTE
AS
(
    SELECT *,
    DATEDIFF(DD,LAG(Date) OVER(PARTITION BY UserID ORDER BY date),Date) DD
    FROM your_table
)

SELECT UserID,Date 
FROM CTE A
WHERE 1 > 
(
    SELECT COUNT(*) 
    FROM CTE B 
    WHERE B.DD >= 7 -- You can check by changing to >7 to meet your req
    AND B.UserID = A.UserID 
    AND B.Date > A.Date 
)

推荐阅读