多个分组的汇总功能

时间:2019-02-06 23:33:26

标签: mysql sql oracle

我正在努力使每天订购量最多的城市。当存在多个按列分组时,我对聚合函数的工作方式有些困惑。

假设存在一个带有列的表 Trips
*订单ID(唯一)
*城市
*日期

数据就像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 :我也不清楚窗口函数中的“分区依据”和“分组依据”之间的关系;

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. 是否在“ GROUP BY”条件下计算count(id)?
  2. rank()仅取决于每天的数字吗? ->获取给定日期中每个城市的每日订单号的排名。

谢谢!

1 个答案:

答案 0 :(得分:3)

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

QTableWidget::setCellWidget()

上述CTE在同一天为每个城市组分配一个等级序列。然后,我们只限制每天计数最高的城市。请注意,QTableWidget::timerEvent(和RANK)允许平局,因此,如果某天有多个城市并列第一名,则计数最高,上述查询就会开始。 / p>