Sql获取连续日期的计数

Posted

技术标签:

【中文标题】Sql获取连续日期的计数【英文标题】:Sql get counts of consecutive dates 【发布时间】:2021-02-04 11:46:25 【问题描述】:

我有一张这样的桌子。

date availability
2021-01-15 y
2021-01-16 y
2021-01-17 y
2021-01-18 n
2021-01-19 n
2021-01-20 y
2021-01-20 n

我希望得到具有连续日期(多个)的结果,计数按可用性分组。如何使用 mysql 查询实现此结果?

date counts availability
2021-01-15 - 2021-01-17 3 y
2021-01-18 - 2021-01-19 2 n

【问题讨论】:

select date, count(*) as counts , 按可用性从表组中选择可用性 嗨,请提供像这里建议的最小示例dba.stackexchange.com/help/minimal-reproducible-example。 为什么在期望的输出中没有提到最后两行?为什么最后一行不包含在最后一个输出行中? 精确 MySQL 版本是什么? 我想获得多个具有相同可用性的连续日期的结果。我的mysql版本8.0.21 【参考方案1】:

您可以减去一个序列并聚合以获得单个序列:

select availability, count(*)
from (select t.*,
             row_number() over (order by date) as seqnum
      from t
     ) t
group by (date - interval seqnum day), availabiility;

那么,不知道你是只想要having count(*) > 1还是多一层聚合:

select min_date, availability, sum(cnt)
from (select availability, count(*) as cnt, min(date) as min_date, max(date) as max_date)
      from (select t.*,
                   row_number() over (order by date) as seqnum
            from t
           ) t
      group by (date - interval seqnum day), availabiility
    ) t
group by availibilty

【讨论】:

是的,我需要多一层聚合。

以上是关于Sql获取连续日期的计数的主要内容,如果未能解决你的问题,请参考以下文章

SQL根据连续日期获取值的变化

SQL 创建连续日期偶数为 0

基于连续条件的 SQL 查询计数

面试题: Hive-SQL查询连续活跃登录用户思路详解

面试题: Hive-SQL查询连续活跃登录用户思路详解

面试题: Hive-SQL查询连续活跃登录用户思路详解