SQL查询:如何展示参与多次的参与者的所有分数记录
解决方法:查询参与多次的参与者全部分数记录
嗨,这个问题我之前也踩过坑!分组后要保留原记录确实容易卡壳,其实有几种简单的思路能搞定,结合你的示例数据给你演示下:
方法一:子查询筛选符合条件的姓名后关联原表
先通过子查询找出所有参与次数超过1次的参与者姓名,再用这个名单去原表中捞对应所有记录:
SELECT Name, Score FROM YourScoreTable WHERE Name IN ( SELECT Name FROM YourScoreTable GROUP BY Name HAVING COUNT(Score) > 1 )
这个逻辑很直观:内层分组查询先筛选出Tom和Dick(因为他们的记录数都>1),外层查询直接把原表中这两个人的所有分数记录都取出来,正好就是你要的结果——排除Harry那条仅有的记录。
方法二:用窗口函数一步到位(适合支持窗口函数的数据库)
如果你的数据库支持窗口函数(比如SQL Server、MySQL 8.0+、PostgreSQL、Oracle等),可以用更简洁的写法:
SELECT Name, Score FROM ( SELECT Name, Score, -- 给每条记录标记该姓名对应的总参与次数 COUNT(*) OVER (PARTITION BY Name) AS TotalParticipations FROM YourScoreTable ) AS ScoreWithCount WHERE TotalParticipations > 1
窗口函数COUNT(*) OVER (PARTITION BY Name)会在不改变原表行数的前提下,给每条记录计算出对应姓名的总记录数,之后在外层筛选总次数>1的记录即可,不需要单独写分组查询,逻辑更连贯。
补充说明
- 如果是旧版本的MySQL(不支持窗口函数),方法一的子查询写法兼容性最好,几乎所有数据库都支持;
- 两种方法的结果是完全一致的,你可以根据自己使用的数据库版本和习惯来选择。
内容的提问来源于stack exchange,提问作者Mr Lister
相关产品推荐
相关产品推荐

