【问题标题】:How to show latest dates for every user and filter rows if datediff between previous & last date < 7如果上一个和最后一个日期之间的 datediff < 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

所以我需要显示每个用户的最新日期,如果上一个日期和最后一个日期之间的日期差异 则隐藏行

提前感谢您的帮助

【问题讨论】:

    标签: sql sql-server tsql greatest-n-per-group


    【解决方案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)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-30
      • 2021-09-11
      • 1970-01-01
      • 2011-09-23
      • 1970-01-01
      • 2021-04-10
      • 2016-10-10
      • 2021-09-22
      相关资源
      最近更新 更多