Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 聚合函数上按划分的秩_Mysql_Sql_Window Functions - Fatal编程技术网

Mysql 聚合函数上按划分的秩

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

以下是一组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 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日期,因为该月份别名将不可用于分组依据?而不是有等级