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

MySQL中ROW_NUMBER()函数仅返回1不递增问题求助

问题原因分析

你这个查询里row_num全是1的核心原因是分组操作和窗口函数的顺序搞反了:

  • 先执行GROUP BY DISEASEIDPK后,同一个疾病的所有患者会被合并成一行统计结果,每个DISEASEIDPK对应唯一一行数据。
  • 再用ROW_NUMBER() OVER(PARTITION BY DISEASEIDPK)时,相当于给每个单独的行开一个分区,每个分区里只有1条数据,所以行号自然只能是1。
两种场景的解决方案

根据你的实际需求,有两种修改方向:

场景1:给疾病分组生成全局递增行号

如果是想给每个疾病的统计结果按顺序编行号(比如按患者数量排序),需要先完成分组统计,再在外层加窗口函数:

SELECT 
  ROW_NUMBER() OVER(ORDER BY PATIENTSAVAILABLE DESC) AS row_num,
  PATIENTSAVAILABLE,
  DISEASEIDPK,
  DISEASENAME
FROM (
  SELECT 
    COUNT(*) AS PATIENTSAVAILABLE, 
    p.DISEASEIDPK, 
    d.DISEASENAME
  FROM doctorsoncallschema.patients p
  -- 用JOIN代替子查询,性能更优
  JOIN doctorsoncallschema.diseases d 
    ON d.DISEASEIDPK = p.DISEASEIDPK
  GROUP BY p.DISEASEIDPK, d.DISEASENAME
) AS grouped_data
ORDER BY row_num ASC;

外层的ROW_NUMBER()没有加PARTITION BY,会对所有分组后的行全局生成递增行号;如果需要按其他规则排序,修改ORDER BY里的字段即可。

场景2:给每个疾病下的患者单独编行号

如果是想给每个疾病下的每个患者生成递增行号(而非分组统计后的行号),需要去掉GROUP BY,直接对原始患者数据按疾病分区:

SELECT 
  ROW_NUMBER() OVER(
    PARTITION BY p.DISEASEIDPK 
    ORDER BY p.PATIENTIDPK -- 按患者ID排序,可替换成其他排序字段
  ) AS row_num,
  COUNT(*) OVER(PARTITION BY p.DISEASEIDPK) AS PATIENTSAVAILABLE, -- 同时统计该疾病的患者总数
  p.DISEASEIDPK,
  d.DISEASENAME,
  p.PATIENTNAME -- 其他患者字段按需添加
FROM doctorsoncallschema.patients p
JOIN doctorsoncallschema.diseases d 
  ON d.DISEASEIDPK = p.DISEASEIDPK
ORDER BY p.DISEASEIDPK, row_num ASC;

这个写法会保留每个患者的记录,同时给每个疾病下的患者从1开始编行号,还能通过窗口函数统计该疾病的总患者数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 06:10:00