Mysql 聚合函数上按划分的秩
以下是一组3张表: 订单订单ID、客户ID、订单日期 订单详细信息订单ID、产品ID、价格、单位 客户ID、注册日期、国家/地区 我需要根据每个国家的收入确定前三个月。 这就是我想到的问题:Mysql 聚合函数上按划分的秩,mysql,sql,window-functions,Mysql,Sql,Window Functions,以下是一组3张表: 订单订单ID、客户ID、订单日期 订单详细信息订单ID、产品ID、价格、单位 客户ID、注册日期、国家/地区 我需要根据每个国家的收入确定前三个月。 这就是我想到的问题: SELECT c.country , MONTH(o.order_date) as _Month , SUM(od.price * od.units) AS revenue , RANK() OVER (PARTITION BY country, _Month ORDER BY re
SELECT c.country
, MONTH(o.order_date) as _Month
, SUM(od.price * od.units) AS revenue
, RANK() OVER (PARTITION BY country, _Month ORDER BY revenue) AS Rank
FROM orders o
LEFT JOIN customers c ON o.customer_id = c.customer_id
JOIN order_detail od
WHERE o.order_id = od.order_id GROUP BY country, Month
HAVING Rank <= 3
由于SUMod.price*od.units as revenue是一个聚合函数,我不确定是否可以在RANK OVER函数中使用,因此此查询是否有效?在支持窗口函数的数据库中,这通常写为:
SELECT cm.*
FROM (SELECT c.country, MONTH(o.order_date) as Month, SUM(od.price * od.units) AS revenue,
RANK() OVER (PARTITION BY country, MONTH(o.order_date) ORDER BY SUM(od.price * od.units) ) AS Rank
FROM orders o LEFT JOIN
customers c
ON o.customer_id = c.customer_id JOIN
order_detail od
ON o.order_id = od.order_id
GROUP BY country, Month
) cm
HAVING Rank <= 3;
这意味着更多的是评论而不是回答,因为我可以在这里设置更漂亮的格式,但典型的查询逻辑操作顺序大致如下: 从第一个开始建造。 将应用联接。 其中将导致筛选上述表格 将应用分组和聚合。 已应用。 将计算窗口函数。这些设备在订单之外运行 选择将被应用。 将采用不同的方法。 订单将被应用。 将应用上限/限制 一般来说,一个步骤中发生的任何事情都可供后续步骤使用,即选择别名可以在ORDER BY中使用,但不能在GROUP BY中使用。但是在MySQL中,HAVE可以使用SELECT中定义的别名。当然,优化器总是可以决定自己做什么,也可以选择不同的顺序,但这是大多数SQL风格中通常发生的事情 我有几篇参考文献与MS SQL相关,但在大多数情况下,它们仍然适用于其他类型:
我认为戈登·林诺夫的答案不对 1您不能直接调用Rank函数中的别名,Gordon已经提到了这一点 2对于您的用例,您希望对每个国家的月份进行排名,排名部分应为
RANK() OVER (PARTITION BY country ORDER BY SUM(od.price * od.units) ) AS Rank
你在使用什么数据库?只有MySQL 8.0支持窗口功能。@GordonLinoff很遗憾,我没有数据库设置,但我一直在练习MySQL。你是按每个国家前3个月的收入排序的吗,还是每个月前3个国家的收入?@Shawn我正在按每个国家前3个月的收入进行排序,您是否有任何正在处理的样本数据?如果我只按国家、月份和收入的划分写排名,是否有效Rank@DigvijaySawant . . . 不是在大多数数据库中,除非在一个名为month的表中有一列。明白了。因此,别名在秩函数中不起作用,但在group by中可以使用。。非常感谢你!!不完全是。Alias可以在分析函数中工作,但与大多数地方一样,Alias的级别与所创建的级别不同。选择按国家划分的排名,\按收入划分的月顺序,作为从选择,月。订单日期为月,月。价格*月。单位为收入@GordonLinoff不按国家分组,月份需要按国家分组,MONTHo.order\u日期,因为该月份别名将不可用于分组依据?而不是有等级