如何用PostgreSQL按组内最大值重复组内行
解决方案(PostgreSQL)
要实现这个需求,我们可以通过计算分组最大rank + 关联numbers表生成重复行的方式完成,具体SQL如下:
-- 先计算每个question_id组内的最大option_rank WITH question_max_rank AS ( SELECT question_id, MAX(option_rank) AS max_rank FROM your_table_name -- 替换成你实际的问题表名称 GROUP BY question_id ) -- 关联原表、分组最大rank表和numbers表生成结果 SELECT q.question_id, q.option_rank, n.id AS position FROM your_table_name q JOIN question_max_rank mr ON q.question_id = mr.question_id JOIN numbers n ON n.id <= mr.max_rank ORDER BY q.question_id, q.option_rank, n.id;
逻辑说明:
- CTE
question_max_rank:通过分组聚合,得到每个question_id对应的最大option_rank(也就是需要重复的次数n)。 - 关联原表与CTE:让每一行数据都能拿到所属分组的
n值。 - 关联numbers表:利用
numbers.id <= mr.max_rank的条件,让每个原表行生成n条重复记录,同时用numbers.id作为新增的position列。 - 排序:按
question_id、option_rank、position排序,保证输出顺序和期望一致。
注意:请把SQL中的your_table_name替换成你实际存储问题数据的表名。如果你的numbers表的id范围(1-1000)足够覆盖所有分组的最大option_rank,这个方案就能完美满足需求。
内容的提问来源于stack exchange,提问作者Mohammed
相关产品推荐
相关产品推荐

