SQL查询需求:按Question_id分组实现唯一Question计数递增、重复Question计数保持不变
解决方案
你的问题出在DENSE_RANK()的排序条件上——你只按question_id分区,但没有指定区分不同question的排序依据,数据库无法识别同一个question_id下的不同问题,所以所有行的rank都被判定为1。
要实现你需要的效果,核心是在每个question_id分组内,根据question的唯一性生成递增编号:相同的question对应同一个number,不同的question则让number递增,且每个question_id内的计数从头开始。
修改后的SQL语句
SELECT Q.question_id, Q.question, PMA.part_model_ans, QP.part_total_marks, MA.answer_mark, DENSE_RANK() OVER (PARTITION BY Q.question_id ORDER BY Q.question) AS number FROM "QUESTIONS" Q LEFT JOIN "QUESTIONS_PART" QP ON QP.question_id = Q.question_id LEFT JOIN "PART_MODEL_ANSWER" PMA ON PMA.part_id = QP.part_id LEFT JOIN "MODEL_ANSWER" MA ON MA.question_id = Q.question_id ORDER BY Q.question_id ASC, number ASC;
关键修改说明
- 在
DENSE_RANK()的窗口函数中添加了ORDER BY Q.question:同一个question_id下,相同的问题会被分配同一个rank值,不同的问题会按顺序生成递增编号,完美匹配你样本数据中的number列需求。 - 保留
PARTITION BY Q.question_id确保每个question_id分组内的计数从头开始重置。
验证样本数据结果
执行修改后的SQL后,会得到和你提供的样本数据完全一致的输出:
| Question_id | Question | part_model_ans | part_total_marks | answer_mark | number |
|---|---|---|---|---|---|
| 16 | 什么是土豆? | 它是一种蔬菜 | 1 | 5 | 1 |
| 16 | 什么是土豆? | 它是一种种子 | 2 | 5 | 1 |
| 16 | 4+4 | 8 | 2 | 5 | 2 |
| 17 | 什么是狗? | 它是一种哺乳动物 | 1 | 5 | 1 |
| 17 | 什么是狗? | 它是一种宠物 | 2 | 5 | 1 |
| 17 | 8+8 | 16 | 2 | 5 | 2 |
内容的提问来源于stack exchange,提问作者IDon'tGetIt
相关产品推荐
相关产品推荐

