sql - 如何在 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
解决方案
使用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 TOP
or LIMIT
。
推荐阅读
- python - 在 sklearn 的 .fit() 方法中使用 numpy.ndarray 与 Pandas Dataframe
- apache-flink - 使用 Flink CEP 测量事件时间延迟
- amazon-web-services - 使用 Lambda 触发器和预留容量处理 AWS SQS 的错误
- reactjs - startSubscription 从未调用过
- linux - 库版本会在 Debian 的下一个版本中变得不可用吗?
- java - 如何从命令行生成 Java 文件的串行版本 UID?
- c++ - 错误打印二维字符数组
- python-3.x - Apache PySpark 的字数统计程序
- android - React Native:推送通知正在冻结 iOS 上的应用程序(白屏)
- apache-spark - 阅读时忽略Spark中排序文件的镶木地板摘要文件(_metadata)?