如何从含duplicateid的Questions表随机获取5条非重复组记录?
解决方案
核心思路
先将所有问题按重复关系分组(主问题与其所有重复项为同一组),每组随机选取一条记录作为代表,最后从这些组代表中随机抽取5条结果。
实现SQL(适用于SQL Server)
WITH GroupedQuestions AS ( SELECT *, -- 统一分组标识:主问题用自身ID,重复项关联主问题ID GROUP_ID = ISNULL(duplicateid, questionid), -- 组内生成随机排序序号 ROW_NUMBER() OVER (PARTITION BY ISNULL(duplicateid, questionid) ORDER BY NEWID()) AS RowNum FROM Questions ), GroupRepresentatives AS ( -- 每组随机选一条记录 SELECT * FROM GroupedQuestions WHERE RowNum = 1 ) -- 从所有组代表中随机取5条 SELECT TOP 5 questionid, question, duplicateid FROM GroupRepresentatives ORDER BY NEWID();
关键逻辑说明
- 分组标识:通过
ISNULL(duplicateid, questionid)将主问题(duplicateid为NULL)和它的所有重复项(duplicateid指向主问题ID)归为同一组 - 组内随机选值:利用
ROW_NUMBER()结合NEWID()在每个组内生成随机排序,仅保留每组的第一条记录,确保每组仅出现一个代表 - 最终随机抽取:从所有组代表中再次随机筛选5条,满足随机且无重复组的要求
内容的提问来源于stack exchange,提问作者John Smit
相关产品推荐
相关产品推荐

