如何实现SQL查询按指定list_id交替返回单条记录?
实现交替循环返回指定list_id的记录
嘿,我懂你想要的效果——让查询结果按照2557→2562→2559的顺序循环输出单条记录,而不是把某个list_id的所有记录堆在一起。咱们可以借助窗口函数ROW_NUMBER()来实现这个逻辑,具体思路如下:
- 给每个
list_id分组内的记录分配递增序号,保留你原本按last_local_call_time排序的规则; - 先按这个序号排序,再按咱们指定的
list_id优先级排序,这样每个序号下的记录都会按2557、2562、2559的顺序出现,形成循环交替的效果。
修改后的SQL语句如下:
WITH ranked_leads AS ( SELECT a.lead_id, a.status, a.[user], a.list_id, a.last_local_call_time, a.owner, -- 给每个list_id分组内的记录按原排序规则分配序号 ROW_NUMBER() OVER (PARTITION BY a.list_id ORDER BY a.last_local_call_time) AS group_rank FROM [LEADS].[dbo].[LDS_VICIDIAL_LIST] a INNER JOIN leads.dbo.LDS_CONTACT_STATUS b ON a.[status] = b.[status] WHERE list_id IN ('2557','2562','2559') AND Dialable='Y' AND a.status<>'5NI' AND a.called_since_last_reset = 'n' ) SELECT lead_id, status, [user], list_id, last_local_call_time, owner FROM ranked_leads ORDER BY group_rank, -- 先按组内序号排序,确保每个循环轮次取各组的第N条记录 -- 自定义list_id的优先级,实现2557→2562→2559的循环顺序 CASE list_id WHEN '2557' THEN 1 WHEN '2562' THEN 2 WHEN '2559' THEN 3 END;
逻辑说明:
ROW_NUMBER() OVER (PARTITION BY a.list_id ORDER BY a.last_local_call_time):把每个list_id的记录单独分组,每组内按你原本的last_local_call_time排序,给每条记录分配一个组内序号(比如2557组的第一条是1,第二条是2;2562组同理)。- 外层排序时,先按
group_rank排序,这样所有组的第1条记录会先被筛选出来,再按CASE定义的顺序排列(2557→2562→2559);接着是所有组的第2条记录,同样按这个顺序排列,以此类推,完美实现你要的循环交替效果。
内容的提问来源于stack exchange,提问作者dragos_kai
相关产品推荐
相关产品推荐

