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

如何按department_id的出现次数排序SQL查询结果集(避免GROUP BY+COUNT组合)

按department_id出现频次排序的解决方案

嘿,我完全懂你的需求——要按department_id在结果集中的出现次数降序排列,又不想因为用GROUP BY + COUNT的组合把原本复杂的查询(涉及大量字段和表)搞乱对吧?

这里给你一个完美的解决方案,用窗口函数就能搞定,完全不需要分组聚合:

SELECT 
    s.s_name, 
    p.p_name, 
    p.department_id
FROM students s 
INNER JOIN professors p ON s.professor_id = p.id
ORDER BY 
    COUNT(*) OVER (PARTITION BY p.department_id) DESC,
    p.department_id; -- 可选:如果频次相同,可以按department_id本身排序

为什么这个方法适合你?

  • 窗口函数COUNT(*) OVER (PARTITION BY p.department_id)会为结果集中的每一行,计算出该行对应的department_id在整个结果里的出现次数,但不会改变原结果集的行数和字段结构,完美适配你实际查询中“大量字段和表”的场景。
  • 排序时直接用这个计算出的频次值降序,就能让出现次数多的department_id对应的所有行排在前面,完全符合你给出的示例期望结果。

用你提供的示例数据测试的话,运行这个SQL后,结果会和你期望的完全一致:

p_namedepartment_id
p3d3
p4d3
p6d3
p2d2
p5d2
p1d1

如果你需要在频次相同的情况下进一步排序,比如按department_id的字母顺序,只需要在ORDER BY里再加一个字段就行,就像上面代码里注释的那样。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 10:37:28