sql - 如何按自定义条件显示每个用户的最新日期范围和过滤周期
问题描述
我有下表结构
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 之前的所有行。
提前感谢您的帮助。
解决方案
你可以试试这个 - 选项 -
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
)
推荐阅读
- sql-server - SQL Server 中从多个实体到一个实体的多重关系(EF 核心)
- sms - 如何从电报机器人发送短信
- azure - Azure 应用程序网关:后端服务器证书已过期。请上传有效证书
- php - 带有 tcpdf 的 fpdi 新添加的文本未显示在 pdf 中
- javascript - Bookdown 和 gitbook
- php - 使用不同的选项卡对一页进行分页 Laravel
- javascript - 在多人游戏中处理时钟
- python - 使用 ctrl + c 停止 Python 脚本
- python - Node.JS Pyshell 在向 Python 发送第二条消息时崩溃,[ERR_STREAM_WRITE_AFTER_END]:结束后写入
- c# - EF Core:使用 InMemory 数据库进行测试的行为不一致