使用标准 SQL 的最长连续

Posted

技术标签:

【中文标题】使用标准 SQL 的最长连续【英文标题】:Longest streak using Standard SQL 【发布时间】:2018-06-08 04:06:08 【问题描述】:

我有一个包含字段的表格:

user_id
tracking_date

有价值观

1, 2017-12-23
2, 2017-12-23
1, 2017-12-24
1, 2017-12-25
2, 2017-12-26
3, 2017-12-26
1, 2017-12-27
2, 2017-12-27

我想找出截至今天所有用户的最长连胜纪录。所以上述查询的o/p形式为:

1, 1
2, 2
3, 0

有没有办法在单个 SQL 查询中实现这个 o/p。

【问题讨论】:

你如何定义最长的连胜? 您可以结合使用 this blog post 来为用户找到最长的连续性和 this forum post 来将 LEAD 转换为 mysql 识别的东西 您的预期输出正确吗?我只能理解你的问题,如果输出是 id:1 with streak:3, id:2 with streak 2, id:3 with streak 1. 【参考方案1】:

这很棘手。对于每个user_id,您想获取上一个日期和最近日期没有记录的最新日期:

select user_id,
       (case when max(tracking_date) <> current_date then 0
             else (current_date -
                   max(case when prev_td is distinct from tracking_date - interval '1 day'
                  )
        end) as seq
from (select t.*,
             lag(tracking_date) over (partition by user_id order by tracking_date) as prev_td
      from t
     ) t
group by user_id;

【讨论】:

我不是在获取日期,而是在寻找所有前几天的计数 @user2077935 。 . .这应该返回计数。

以上是关于使用标准 SQL 的最长连续的主要内容,如果未能解决你的问题,请参考以下文章

SQL(之二)-查询“最长连续登录天数“

SQL(之二)-查询“最长连续登录天数“

按团队分组的基于赢、平和输的连续连胜/非连胜

最长连续公共子串最长公共子串(可以非连续)最长回文串(连续)最长回文串(可以不连续)最长递增数组的求解

计算一个值在 Hive/SQL 中连续出现的次数

Leetcode 128 最长连续序列