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