按编程语言筛选认知得分前2名求职者的SQL实现(禁用ROW_NUMBER())
解决方案:不使用ROW_NUMBER()筛选各编程语言认知得分前2的求职者
方法一:关联子查询统计高分数量
SELECT a.name, a.[cognitive score], a.[programming language] FROM applicants a WHERE ( SELECT COUNT(DISTINCT b.[cognitive score]) FROM applicants b WHERE b.[programming language] = a.[programming language] AND b.[cognitive score] > a.[cognitive score] ) < 2 ORDER BY a.[programming language], a.[cognitive score] DESC;
- 逻辑说明:子查询会统计当前求职者所属编程语言分组中,得分严格高于当前者的不同分数个数。如果这个个数小于2,说明当前求职者的得分在组内排前2(包含并列高分的情况)。
- 若不需要保留并列高分(只取前2个不同的分数层级),可以去掉
DISTINCT,此时统计的是高分人数而非不同分数的数量。
方法二:自连接分组统计
SELECT DISTINCT a.name, a.[cognitive score], a.[programming language] FROM applicants a LEFT JOIN applicants b ON a.[programming language] = b.[programming language] AND b.[cognitive score] > a.[cognitive score] GROUP BY a.id, a.name, a.[cognitive score], a.[programming language] HAVING COUNT(b.id) < 2 ORDER BY a.[programming language], a.[cognitive score] DESC;
- 逻辑说明:通过自连接匹配同组内得分更高的求职者,然后分组统计每个求职者对应的高分人数。当高分人数小于2时,该求职者属于组内前2名。
- 使用
DISTINCT是为了避免自连接产生的重复行,也可以将COUNT(b.id)替换为COUNT(DISTINCT b.id)来达到同样效果。
内容的提问来源于stack exchange,提问作者swede
相关产品推荐
相关产品推荐

