MySQL的月环比增长?
有两个表:表1和表2 表1的样本数据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 |
| 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
子查询并不是绝对必要的——它只是避免了将冗长的窗口规范重复三次