【问题标题】:MAX(COUNT(...)) - ERROR: calls to aggregate functions cannot be nestedMAX(COUNT(...)) - 错误:不能嵌套调用聚合函数
【发布时间】:2021-03-29 14:35:55
【问题描述】:

我有两张桌子 - ticket(..,event_name,..)event(..,name,..).

任务:

编写一个查询,显示活动名称和售出最多门票的活动门票数量。

下面的代码报错:ERROR: calls to aggregate functions cannot be nested

SELECT name, COUNT(event_name) as ticket_count
FROM event
INNER JOIN ticket
ON event.name = ticket.event_name
GROUP BY name
HAVING COUNT(event_name) = MAX(COUNT(event_name));

我知道我不能使用MAX(COUNT()),但是我应该写什么来代替它来获得类似的逻辑?

我只有讲师的提示:)

COUNT(...)= (SELECT MAX(...) FROM (...))

【问题讨论】:

  • 你不能在有语句中使用 MAX(COUNT())
  • 顺便说一句,在您的查询中,表 event 是不必要的。 select event_name, count(*) as ticket_count from ticket group by event_name order by ticket_count desc limit 1;

标签: postgresql function count max aggregate


【解决方案1】:

您必须根据计数对事件进行排名,例如使用窗口函数dense_rank()

select event_name, ticket_count
from (
  select event_name, 
         count(*) as ticket_count,
         dense_rank() over (order by count(*) desc) as rnk
  from ticket
  group by event_name
) t
where rnk = 1;

窗口函数dense_rank()group by 之后应用,并将根据该活动的门票数量计算排名。因为order by ... DESC,即使票数最多的人也会获得第一名。

如果有两个活动的门票数量相同,则会列出两者。如果您不想这样,请使用row_number() 而不是dense_rank()

请注意,我还从查询中删除了 event 表,因为它不需要它。

【讨论】:

    【解决方案2】:

    我能想到的最简单的解决方案是使用 ordering 和 LIMIT 1。

    SELECT
      name, COUNT(event_name) as ticket_count
    FROM event
      LEFT JOIN ticket ON event.name = ticket.event_name
    GROUP BY
      name
    ORDER BY
      ticket_count DESC
    LIMIT 1;
    

    (使用 LEFT JOIN,因为我猜你可能有没有门票的活动)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-29
      • 1970-01-01
      • 2019-12-22
      相关资源
      最近更新 更多