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

