使用 PERIOD_DIFF mysql

问题描述

我有如下表名surveydb,我用的是MysqL 5.7

PERIODE 调查
2020-02-03 2
2020-02-04 3
2020-03-10 5
2020-03-11 4
2020-07-28 1
2020-08-28 3
2020-11-28 4

我在MysqL中使用了以下查询

SELECT `SURVEY`,MIN(`PERIODE`) AS `Range Start`,MAX(`PERIODE`) AS `Range End`,COUNT(*) AS `Count`
FROM `surveydb`
GROUP BY FLOOR(PERIOD_DIFF(@T1,DATE_FORMAT(`PERIODE`,'%Y%m')) / 3)

我想按 3 个月的间隔分组,但结果不同,

从 2020-02-03 到 2020-03-11 的日期间隔只显示了 1 个调查,尽管它们有不同的调查值,我如何显示每个组范围的所有调查

调查 范围开始 范围结束 计数
2 2020-02-03 2020-03-11 4
1 2020-07-28 2020-08-28 2

我无法显示月间隔内的所有调查,例如从 2020-02-03 到 2020-03-11

相反,我想得到这样的结果:

调查 范围开始 范围结束 计数
2 2020-02-03 2020-03-11 4
3 2020-02-03 2020-02-03 4
5 2020-02-03 2020-02-03 4
4 2020-02-03 2020-02-03 4
1 2020-07-28 2020-08-28 2

解决方法

看来你也需要按调查分组

SELECT `SURVEY`,MIN(`PERIODE`) AS `Range Start`,MAX(`PERIODE`) AS `Range End`,COUNT(*) AS `Count`
FROM `surveydb`
GROUP BY `SURVEY`,FLOOR(PERIOD_DIFF(@T1,DATE_FORMAT(`PERIODE`,'%Y%m')) / 3)
,

你想要窗口函数而不是聚合吗?

select survey,min(periode) over(partition by floor(period_diff(@t1,date_format(periode,'%y%m')) / 3)) as range_start,'%y%m')) / 3)) as range_end,count(*)     over(partition by floor(period_diff(@t1,'%y%m')) / 3)) as cnt
from surveydb

我们可以使用命名窗口来缩短查询:

select survey,min(periode) over w as range_start,min(periode) over w as range_end,count(*)     over w as cnt
from surveydb
window w as (partition by floor(period_diff(@t1,'%y%m')) / 3))