首页 > 解决方案 > 如何在 SQL 中获取本质上是嵌套聚合函数的完整行?

问题描述

我有一张活动表,以及一张参与上述活动的表。我想统计参加每个筹款活动的人数。

这可以通过以下方式成功完成:

SELECT Participate.eid, COUNT(Participate.pid) AS numpeople
FROM Participate
WHERE Participate.eid IN(
    SELECT Event.eid
    FROM Event
    WHERE Event.type = 'fundraising'
)
GROUP BY Participate.eid

这会输出以下结果:

eid      numpeople
16           8
 6           7
 3          10
 5           6

我现在想要的是让参加特定活动的人数最多。首先,我必须不使用任何视图,这是我能够做到的唯一方法。我也尝试过使用派生表,但没有成功。

我基本上想要一个结果:

eid     numpeople
 3         10

我尝试对派生表执行此操作,但它不起作用,因为我被迫使用 GROUP BY 语句:

SELECT Temp1.eid, MAX(Temp1.numpeople) AS numpeople
FROM (
    SELECT Participate.eid, COUNT(Participate.pid) AS numpeople
    FROM Participate
    WHERE Participate.eid IN(
        SELECT Event.eid
        FROM Event
        WHERE Event.type = 'fundraising'
    )
    GROUP BY Participate.eid
) AS Temp1;

这是我得到的最接近的东西,但显然,'eid' 不存在于行中:

SELECT MAX(Temp1.numpeople) AS numpeople
FROM (
    SELECT Participate.eid, COUNT(Participate.pid) AS numpeople
    FROM Participate
    WHERE Participate.eid IN(
        SELECT Event.eid
        FROM Event
        WHERE Event.type = 'fundraising'
    )
    GROUP BY Participate.eid
) AS Temp1;

哪个有输出:

numpeople
   10

标签: sql

解决方案


使用order by并将结果限制为一行:

SELECT p.eid, COUNT(p.pid) AS numpeople
FROM Participate p
WHERE p.eid IN (SELECT e.eid
                FROM Event e
                WHERE e.type = 'fundraising'
               )
GROUP BY p.eid
ORDER BY numpeople DESC
FETCH FIRST 1 ROW ONLY;

并非所有数据库都支持FETCH FIRST,因此您可能需要使用SELECT TOPor LIMIT


推荐阅读