使用标准SQL的最长条纹

时间:2017-12-27 13:53:11

标签: sql postgresql standard-sql

我有一个包含字段的表:

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。

1 个答案:

答案 0 :(得分:0)

这很棘手。对于每个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;