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
相关产品推荐
相关产品推荐

