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 |
【问题讨论】:
selectdate
, 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获取连续日期的计数的主要内容,如果未能解决你的问题,请参考以下文章