gpt4 book ai didi

mysql - 多个分组依据的聚合函数

转载 作者:行者123 更新时间:2023-11-29 05:02:57 25 4
gpt4 key购买 nike

我正在尝试获取每天订单量最大的城市。当有多个按列分组时,我对聚合函数的工作方式有点困惑。

假设有一个表Trips,其中包含以下列:
* 订单编号(唯一)
* 城市
*日期

数据就像leetcode中的一道题sample

我想找出每天订单量最大的城市。

select 
date,
city,
count(*) as city_cnt
from trips a
group by date, city
having count(*) = (select max(count(*))
from trips b
where b.date = a.date
group by b.city)

这段代码可以得到预期的结果,但我认为可能有更好的解决方案。

问题 1:还有其他方法可以得到结果吗?

问题 2:起初,我尝试在第一个没有“HAVING”子句的“SELECT”子句中使用 max(count(*))。出现错误“不是单组组函数”:

select 
date,
city,
max(count(*)) as max_city_cnt
from trips a
group by date, city

我以为count(*)可以计算每个城市每天的订单数,用max()函数可以得到每天最大的订单数。但它不起作用。谁能解释一下?

问题3:我也不太清楚窗口函数中partition by和group by的关系;

select
date,
city,
count(id) city_cnt,
rank() over (partition by date order by count(id) desc) d_rank
from trips
group by date, city
;

对于窗口函数中的代码:

rank() over (partition by date order by count(id) desc) d_rank
  1. count(id) 是在“GROUP BY”条件下计算的吗?
  2. rank() 是否仅取决于每天的数字? --> 获取指定日期各城市的每日订单数排名。

提前致谢!

最佳答案

您使用 RANK 的版本可能是最不冗长且性能最高的。但是,您需要一个子查询来将每个城市/日期组限制为计数最高的记录:

WITH cte AS (
SELECT date, city, COUNT(id) city_cnt,
RANK() OVER (PARTITION BY date ORDER BY COUNT(id) DESC) d_rank
FROM trips
GROUP BY date, city
)

SELECT date, city
FROM cte
WHERE d_rank = 1;

上述CTE在同一天为每组城市分配了一个排名系列。然后,我们仅限于每天计数最高的城市。请注意,RANK(和 DENSE_RANK)允许并列,因此如果某一天有多个城市并列第一且计数最高,则上述查询将接受它。

关于mysql - 多个分组依据的聚合函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54564196/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com