Mysql 日期范围按行动态更改
我需要为查询结果的每一行指定日期范围,例如:Mysql 日期范围按行动态更改,mysql,sql,performance,Mysql,Sql,Performance,我需要为查询结果的每一行指定日期范围,例如: select DATE_FORMAT(date_purchase, '%Y-%m')as Year_month, count(*) as Count from tickets where date_purchase BETWEEN '2019-01-01' AND '2019-03-31' group by Year_month 此查询将给出该结果: Year_month | Count 2019-01
select
DATE_FORMAT(date_purchase, '%Y-%m')as Year_month,
count(*) as Count
from tickets
where date_purchase BETWEEN '2019-01-01' AND '2019-03-31'
group by Year_month
此查询将给出该结果:
Year_month | Count
2019-01 | 134
2019-02 | 154
2019-03 | 123
但与一年前的计数相比,我需要再增加一列,预期结果如下:
Year_month | Count | Count_One_Year_Ago_Per_Month
2019-01 | 134 | (count(*) between 2018-01 and 2019-01)
2019-02 | 154 | (count(*) between 2018-02 and 2019-02)
2019-03 | 123 | (count(*) between 2018-03 and 2019-03)
最好的方法是什么
编辑:我的Mysql版本是5.7如果您有所有月份的数据,最简单的方法是使用lag: 编辑: 您还可以使用条件聚合:
select month(date_purchase),
sum(year(date_purchase) = 2018) as cnt_2018,
sum(year(date_purchase) = 2019) as cnt_2019
from tickets t
where date_purchase >= '2018-01-01' and
date_purchase < '2019-04-01' and
month(date_purchase) in (1, 2, 3)
group by month(date_purchase);
我认为,如果您想要完整的年数,可能需要一个相关子查询:
select ym.*,
(select count(*)
from tickets t2
where date_format(t2.date_purchase, '%Y-%m') < ym.year_month and
date_format(t2.date_purchase + interval 1 year, '%Y-%m') >= ym.year_month
) as prev_cumulative_year
from (select date_format(sa.date_purchase, '%Y-%m') as Year_month,
count(*) as Count
from tickets t
group by Year_month
) ym
你可以检查这个脚本- 您可以使用一些示例数据来检查
SELECT
A.date_purchase,
MAX(c_count) Current_month_count,
COUNT(*) last_year_count
FROM
(
SELECT
DATE_FORMAT(date_purchase, '%Y-%m') AS `date_purchase`,
COUNT(*) c_count
FROM tickets
GROUP BY DATE_FORMAT(date_purchase, '%Y-%m')
)A
INNER JOIN tickets B
ON A.date_purchase
BETWEEN
DATE_FORMAT(B.date_purchase, '%Y-%m')
AND
DATE_FORMAT(B.date_purchase + interval 12 month, '%Y-%m')
GROUP BY A.date_purchase
我忘记提到的一个细节是,我的MYSQL版本是5.7.26,所以我不能使用滞后功能:/谢谢,但是编辑给了我每年每个月的计数,而不是一年的全部数据,例如:2018-01和2019-01之间的计数。
SELECT
A.date_purchase,
MAX(c_count) Current_month_count,
COUNT(*) last_year_count
FROM
(
SELECT
DATE_FORMAT(date_purchase, '%Y-%m') AS `date_purchase`,
COUNT(*) c_count
FROM tickets
GROUP BY DATE_FORMAT(date_purchase, '%Y-%m')
)A
INNER JOIN tickets B
ON A.date_purchase
BETWEEN
DATE_FORMAT(B.date_purchase, '%Y-%m')
AND
DATE_FORMAT(B.date_purchase + interval 12 month, '%Y-%m')
GROUP BY A.date_purchase