如果上一个和最后一个日期之间的 datediff < 7,如何显示每个用户的最新日期并过滤行
Posted
技术标签:
【中文标题】如果上一个和最后一个日期之间的 datediff < 7,如何显示每个用户的最新日期并过滤行【英文标题】:How to show latest dates for every user and filter rows if datediff between previous & last date < 7 【发布时间】:2020-07-23 05:29:27 【问题描述】:我有下表结构
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-02-03
2 2020-02-05
2 2020-02-06
3 2020-02-12
3 2020-02-13
3 2020-03-25
3 2020-03-26
想要的结果:
UserID | Date
1 2020-03-08
1 2020-03-09
2 2020-02-03
2 2020-02-05
2 2020-02-06
3 2020-03-25
3 2020-03-26
所以我需要显示每个用户的最新日期,如果上一个日期和最后一个日期之间的日期差异 则隐藏行
提前感谢您的帮助
【问题讨论】:
【参考方案1】:我了解您需要每位用户最近 7 天的数据。如果是这样,您可以使用窗口函数:
select userid, date
from (
select t.*, max(date) over(partition by userid) max_date
from mytable t
) t
where datediff(day, date, max_date) <= 7
Demo on DB Fiddle:
用户名 |日期 :----- | :--------- 1 | 2020-03-08 1 | 2020-03-09 2 | 2020-02-03 2 | 2020-02-05 2 | 2020-02-06 3 | 2020-03-25 3 | 2020-03-26【讨论】:
您好,感谢您的帮助。不仅是最近 7 天的数据,而且如果上一个日期和下一个日期的差异小于 7 天,则所有数据。因此,例如对于用户 1,如果我们有他整个 4 月的数据,我需要显示它。 @RomuloSQL:我不知道你的意思是什么......这没有显示在你的示例数据中(你可以看到我的查询产生的结果集与你显示的相同) . 例如,用户 4 有 2020-01-01 到 2020-01-05 的记录,也有 2020-02-23 到 2020-03-31 的记录。假设用户 4 没有 2020-03-02 到 2020-03-05 的记录。我需要在 2020-02-23 到 2020-03-31(因为它是最后一个日期期间)期间显示用户 4 的所有可用记录,因为我们没有从 2020-03-02 到 2020-03-05 的天差没有任何记录 @RomuloSQL:在发布答案后对问题进行实质性修改不是一个好习惯。而且您可以看到 cmets 并不是真的要提供示例数据(格式太差了)。我建议asking a new question,提供更能代表您的用例的示例数据和预期结果,以及有关逻辑的更多详细信息。【参考方案2】:我可以考虑使用下面提到的两个 With 子句语句。
日期1为( 选择用户名,日期 从 ( 选择用户,日期, rank() over(partition by userid order by date desc) as rnk 从表)A 其中 A.rnk=1)
将 Date2 设为 ( 选择用户名,日期 从 ( 选择用户名,日期,, rank () over (partition by userid order by date desc) as rnk 来自表)B 其中 B.rnk = 2)
选择 date1.userid,date1.date from date1 加入 date2 于 date1.userid=date2.userid 其中 DATEDIFF (date1.date,date2.date)
【讨论】:
以上是关于如果上一个和最后一个日期之间的 datediff < 7,如何显示每个用户的最新日期并过滤行的主要内容,如果未能解决你的问题,请参考以下文章
Javascript和datediff mysql中日期之间的日期差异不相等