You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免嵌套聚合函数?PostgreSQL查询最高发表量作者性别

解决PostgreSQL中查询发表量最高作者性别的问题

嘿,我来帮你搞定这个查询问题!先理清楚你的需求:从给定的三张表中,找出发表文章数量最多的作者的性别。你之前尝试的SQL确实踩了聚合函数不能嵌套的坑,而且分组逻辑也有点偏差,咱们一步步来修正。

首先明确你的表结构(方便后续参考):

author(name, nationality, Gender);
article(title, year, conference);
publication(articleTitle, authorName);

问题分析

你需要先统计每个作者的发表数量,找到发表量最高的那批作者,再获取他们的性别。直接按gender分组是不对的——因为同一个性别可能有多个作者,发表量差异很大,咱们得先聚焦到作者个体的发表数上。

方案一:用窗口函数(PostgreSQL推荐用法)

PostgreSQL对窗口函数支持非常好,用RANK()或者DENSE_RANK()可以轻松实现排名,逻辑清晰又高效:

-- 第一步:统计每个作者的发表数和对应的性别
WITH author_pub_counts AS (
    SELECT 
        p.authorName,
        COUNT(p.articleTitle) AS pub_count,
        a.gender
    FROM publication p
    JOIN author a ON p.authorName = a.name
    GROUP BY p.authorName, a.gender
),
-- 第二步:给作者按发表数降序排名
ranked_authors AS (
    SELECT 
        gender,
        pub_count,
        RANK() OVER (ORDER BY pub_count DESC) AS rnk
    FROM author_pub_counts
)
-- 第三步:取排名第一的性别(去重避免重复结果)
SELECT DISTINCT gender
FROM ranked_authors
WHERE rnk = 1;

如果有多个作者发表量并列最高,这个查询会把他们的性别都返回(如果性别不同的话),用DISTINCT是为了避免同一个性别重复出现。

方案二:用子查询嵌套(兼容更多SQL方言)

如果你不想用窗口函数,也可以通过嵌套子查询先找到最高发表量,再匹配对应的作者性别:

SELECT DISTINCT a.gender
FROM author a
JOIN publication p ON a.name = p.authorName
GROUP BY a.name, a.gender
-- 匹配发表数等于全局最高发表量的作者
HAVING COUNT(p.articleTitle) = (
    -- 先统计所有作者的发表数,再取最大值
    SELECT MAX(pub_count)
    FROM (
        SELECT COUNT(articleTitle) AS pub_count
        FROM publication
        GROUP BY authorName
    ) AS author_counts
);

关于PostgreSQL的影响

其实这两种方案在PostgreSQL里都完全适用,窗口函数的方案在性能上更优,尤其是数据量较大的时候,PostgreSQL对CTE和窗口函数的优化做得很好,不用担心兼容性问题。

内容的提问来源于stack exchange,提问作者Sergio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:40:35