MySQL的月环比增长?

MySQL的月环比增长?,mysql,sql,datetime,count,date-arithmetic,Mysql,Sql,Datetime,Count,Date Arithmetic,有两个表:表1和表2 表1的样本数据 | order_id | order_date | user_id | quantity | ---------------------------------------------- | IX502334 | 2020-01-01 | user102 | 50 | 表2的样本数据 | user_id | city | country | ----------------------------------- | user102 |

有两个表:表1和表2

表1的样本数据

| order_id | order_date | user_id | quantity |
----------------------------------------------
| IX502334 | 2020-01-01 | user102 |    50    |
表2的样本数据

| user_id |   city   | country |
-----------------------------------
| user102 |  London  | England |
我想了解“澳大利亚”国家订单的月环比增长情况

以下是我所做的:

SELECT EXTRACT(MONTH FROM order_date) AS month_number, COUNT(order_id) AS orders FROM table_1
JOIN table_2 ON table_1.user_id = table_2.user_id
WHERE country = 'Australia'
GROUP BY month_number
以上内容将为我提供澳大利亚每月的订单数量

现在是订单增长

select month_number, SUM(orders) as current_orders,
lag(sum(orders), 1) over (order by month_number) as previous_month_orders,
            (100 * (sum(orders) - lag(sum(orders), 1) over (order by month_number)) / lag(sum(orders), 1) over 
            (order by month_number)) || '%' as growth
            from (SELECT EXTRACT(MONTH FROM order_date) AS month_number, COUNT(order_id) AS orders FROM table_1
JOIN table_2 ON table_1.user_id = table_2.user_id
WHERE country = 'Australia'
GROUP BY month_number) table_3
            group by 1
            order by 1;
我说得对吗?我没有数据库来运行查询并自己检查结果


还有其他方法吗?

我认为您的查询不起作用,因为提取月份时没有包括年份。因此,不同年份同一月份的数据正在合并

假设您有每个月的数据,您可以使用
LAG()


请注意,您不需要子查询来将窗口函数与聚合结合起来。

我认为您的查询不起作用,因为在提取月份时您没有包括年份。因此,不同年份同一月份的数据正在合并

假设您有每个月的数据,您可以使用
LAG()


请注意,您不需要子查询来组合窗口函数和聚合。

您的查询将混合属于不同年份的月份。它还具有不必要的嵌套级别

我想这样说:

select 
    date_format(t1.order_date, '%Y-%m-01') order_month,
    count(*) as current_orders,
    lag(count(*)) over(order by date_format(t1.order_date, '%Y-%m-01')) as previous_month_orders,
    (count(*) - lag(count(*)) over(order by date_format(t1.order_date, '%Y-%m-01')))
        / lag(count(*)) over(order by date_format(t1.order_date, '%Y-%m-01')) as growth
from table_1 t1
inner join table2 t2 on t2.user_id = t1.user_id
where t2.country = 'Australia'
group by order_month
    
你还需要担心一个月没有销售的可能性;如果是这样,您的查询将错误地将结果与上个月的销售额进行比较。您可以使用范围框架解决此问题:

select t.*, 
    (current_orders - previous_month_orders) / nullif(previous_month_orders, 0) as growth
from (
    select 
        date_format(t1.order_date, '%Y-%m-01') order_month,
        count(*) as current_orders,
        sum(count(*)) over(
            order by date_format(t1.order_date, '%Y-%m-01')
            range between interval 1 month preceding and interval 1 month preceding
        ) as previous_month_orders
    from table_1 t1
    inner join table2 t2 on t2.user_id = t1.user_id
    where t2.country = 'Australia'
    group by order_month
) t

子查询并不是绝对必要的,它只是避免了将冗长的窗口规范重复三次。

您的查询将混合属于不同年份的月份。它还具有不必要的嵌套级别

我想这样说:

select 
    date_format(t1.order_date, '%Y-%m-01') order_month,
    count(*) as current_orders,
    lag(count(*)) over(order by date_format(t1.order_date, '%Y-%m-01')) as previous_month_orders,
    (count(*) - lag(count(*)) over(order by date_format(t1.order_date, '%Y-%m-01')))
        / lag(count(*)) over(order by date_format(t1.order_date, '%Y-%m-01')) as growth
from table_1 t1
inner join table2 t2 on t2.user_id = t1.user_id
where t2.country = 'Australia'
group by order_month
    
你还需要担心一个月没有销售的可能性;如果是这样,您的查询将错误地将结果与上个月的销售额进行比较。您可以使用范围框架解决此问题:

select t.*, 
    (current_orders - previous_month_orders) / nullif(previous_month_orders, 0) as growth
from (
    select 
        date_format(t1.order_date, '%Y-%m-01') order_month,
        count(*) as current_orders,
        sum(count(*)) over(
            order by date_format(t1.order_date, '%Y-%m-01')
            range between interval 1 month preceding and interval 1 month preceding
        ) as previous_month_orders
    from table_1 t1
    inner join table2 t2 on t2.user_id = t1.user_id
    where t2.country = 'Australia'
    group by order_month
) t
子查询并不是绝对必要的——它只是避免了将冗长的窗口规范重复三次