Oracle查询需求:按行业代码交替展示SEQ为1与2的记录
实现按行业分组交替显示SEQ=1和SEQ=2的记录
我完全get到你的需求了:按INDUSTRY分组后,每个组里要交替展示SEQ=1和SEQ=2的记录,就像你给的示例那样——行业10里先出一条SEQ1的,再一条SEQ2的,循环排列;行业20也遵循同样的规则。
核心思路
要实现这种交替排列,关键是给每个行业内的SEQ=1和SEQ=2记录分别分配组内序号,然后通过这个序号来控制交替顺序:
- 对每个
INDUSTRY,给SEQ=1的记录按你需要的顺序(比如示例里的TICKER顺序)生成连续行号; - 同样给每个
INDUSTRY内SEQ=2的记录生成连续行号; - 最后按
INDUSTRY、组内行号、SEQ排序,就能实现交替展示的效果。
通用SQL解决方案
假设你的表名为your_table,用窗口函数ROW_NUMBER()就能轻松实现(支持绝大多数现代数据库:MySQL 8+、SQL Server、PostgreSQL等):
WITH ranked_records AS ( SELECT SEQ, TICKER, INDUSTRY, -- 按行业+SEQ分组,给每组内的记录编行号,这里用TICKER排序,你可以换成自己需要的字段 ROW_NUMBER() OVER (PARTITION BY INDUSTRY, SEQ ORDER BY TICKER) AS group_row_num FROM your_table ) SELECT SEQ, TICKER, INDUSTRY FROM ranked_records -- 先按行业分组,再按组内行号排序,最后按SEQ控制交替顺序(先1后2) ORDER BY INDUSTRY, group_row_num, SEQ;
适配老版本数据库(无CTE支持)
如果你的数据库不支持CTE(比如MySQL 5.x),可以用子查询代替:
SELECT SEQ, TICKER, INDUSTRY FROM ( SELECT SEQ, TICKER, INDUSTRY, ROW_NUMBER() OVER (PARTITION BY INDUSTRY, SEQ ORDER BY TICKER) AS group_row_num FROM your_table ) AS ranked_records ORDER BY INDUSTRY, group_row_num, SEQ;
完全匹配你示例的调整
如果想要和你给出的期望结果完全一致(比如行业10里SEQ1顺序是AAPL→FB,SEQ2顺序是IBM→CSCO),可以手动指定排序规则:
WITH ranked_records AS ( SELECT SEQ, TICKER, INDUSTRY, ROW_NUMBER() OVER (PARTITION BY INDUSTRY, SEQ ORDER BY CASE SEQ WHEN 1 THEN CASE TICKER WHEN 'AAPL' THEN 1 WHEN 'FB' THEN 2 WHEN 'IBM' THEN 3 WHEN 'CSCO' THEN 4 END WHEN 2 THEN CASE TICKER WHEN 'IBM' THEN 1 WHEN 'CSCO' THEN 2 WHEN 'JNJ' THEN 3 WHEN 'CMPQ' THEN 4 END END ) AS group_row_num FROM your_table ) SELECT SEQ, TICKER, INDUSTRY FROM ranked_records ORDER BY INDUSTRY, group_row_num, SEQ;
执行这段代码后,就能得到你想要的结果:
SEQ TICKER INDUSTRY 1 AAPL 10 2 IBM 10 1 FB 10 2 CSCO 10 1 FEYE 20 2 PANW 20
本质上,这个方案的核心就是通过给同行业同SEQ的记录分配组内行号,让相同行号的SEQ1和SEQ2记录挨在一起,从而实现交替展示的效果。
内容的提问来源于stack exchange,提问作者Landon Statis
相关产品推荐
相关产品推荐

