如何基于字符串列排序记录,循环从各字符串类别依次取一条展示
SQL轮询分组排序实现方案
核心逻辑
你需要的是按F2分组轮询输出的效果,实现逻辑分为两步:
- 给每个F2分类下的记录,按你需要的组内顺序(示例中是按Id升序)分配组内行号
- 排序时优先按组内行号升序,再按F2值升序,就能实现先取所有分类第一条、再取所有分类第二条的效果
主流数据库实现(支持窗口函数:MySQL8.0+、PostgreSQL、SQL Server、Oracle等)
直接用ROW_NUMBER()窗口函数生成分组行号,再排序即可:
SELECT Id, F1, F2 FROM ( SELECT Id, F1, F2, -- 按F2分组,组内按Id升序编行号 ROW_NUMBER() OVER (PARTITION BY F2 ORDER BY Id ASC) AS group_row_num FROM 你的表名 ) t -- 先按组内行号排序,同一行号的按F2排序 ORDER BY group_row_num ASC, F2 ASC;
执行后输出结果和你期望的完全一致。
MySQL 5.x 兼容实现(不支持窗口函数)
可以用用户变量模拟分组行号的生成:
SELECT Id, F1, F2 FROM ( SELECT Id, F1, F2, @row_num := IF(@current_f2 = F2, @row_num + 1, 1) AS group_row_num, @current_f2 := F2 FROM 你的表名, (SELECT @row_num := 0, @current_f2 := '') AS init ORDER BY F2 ASC, Id ASC ) t ORDER BY group_row_num ASC, F2 ASC;
内容的提问来源于stack exchange,提问作者Syed Saqlain
相关产品推荐
相关产品推荐

