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

SQL按lkey字段GROUP BY后如何获取对应记录的pkey字段值

你原有的GROUP BY写法无法直接追加pkey字段,因为SQL规范里非分组字段、非聚合字段不能直接出现在分组查询的SELECT子句中,可以通过以下两种常用方案实现需求:

方案1:窗口函数(推荐,适用于MySQL 8.0+、PostgreSQL、SQL Server等所有支持窗口函数的现代数据库)

这个方案逻辑清晰性能好,通过对同一lkey下的votecount倒序排名,取排名第一的记录即可同时拿到对应的pkey、最大votecount等字段。

WITH ranked_votes AS (
    SELECT 
        pkey, lkey, votecount,
        -- 按lkey分组,组内按votecount从大到小排序
        ROW_NUMBER() OVER (PARTITION BY lkey ORDER BY votecount DESC) AS rank_num
    FROM VOTES
    WHERE ekey = (SELECT ekey FROM Elections WHERE electionid='NR2019')
)
SELECT pkey, lkey, votecount AS max_votecount
FROM ranked_votes
WHERE rank_num = 1 -- 取每个lkey下votecount最大的第一条记录
ORDER BY lkey ASC;

如果同一lkey下存在多条votecount相等的最大值记录,且你需要把所有符合条件的pkey都返回,把ROW_NUMBER替换为RANK()即可。

方案2:关联子查询(兼容低版本不支持窗口函数的数据库)

通过先查出每个lkey对应的最大votecount,再和原表关联匹配拿到对应pkey:

SELECT v.pkey, v.lkey, v.votecount AS max_votecount
FROM VOTES v
INNER JOIN (
    -- 先查询每个lkey的最大得票数
    SELECT lkey, MAX(votecount) AS max_vote
    FROM VOTES
    WHERE ekey = (SELECT ekey FROM Elections WHERE electionid='NR2019')
    GROUP BY lkey
) t ON v.lkey = t.lkey AND v.votecount = t.max_vote
WHERE v.ekey = (SELECT ekey FROM Elections WHERE electionid='NR2019')
ORDER BY v.lkey ASC;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 01:06:00