oracle查询交替记录

时间:2018-04-18 02:33:51

标签: sql oracle alternating

我有一个看起来像这样的表:

SEQ     TICKER     INDUSTRY
1        AAPL        10
1        FB          10
1        IBM         10
1        CSCO        10
1        FEYE        20
1        F           20
2        JNJ         10
2        CMPQ        10
2        CYBR        10
2        PFPT        10
2        K           20
2        PANW        20

我需要的是使用相同的行业代码记录,以便在1和1之间交替。 2条记录如下:

1   AAPL   10
2   IBM    10
1   FB     10
2   CSCO   10
1   FEYE   20
2   PANW   20

所以基本上,按照相同的行业代码分组,在1和1之间交替。 2条记录。

无法弄清楚如何。

2 个答案:

答案 0 :(得分:0)

使用分析函数创建一个为每个组(行业和序列)重新开始的行号,然后按该行号排序。

select seq, ticker, industry
    ,row_number() over (partition by industry, seq order by ticker)custom_order
from stocks
order by industry, custom_order, seq;

有关完整示例,请参阅this SQL Fiddle。 (它与您的示例结果不完全匹配,但是您的示例结果不正确或者我不明白这个问题的其他内容。)

答案 1 :(得分:0)

不要看你如何在你的问题中得到示例结果,但结果如下:

| SEQ | TICKER | INDUSTRY |
|-----|--------|----------|
|   1 |   AAPL |       10 |
|   2 |   CMPQ |       10 |
|   1 |   CSCO |       10 |
|   2 |   CYBR |       10 |
|   1 |     FB |       10 |
|   2 |    IBM |       10 |
|   1 |    JNJ |       10 |
|   2 |   PFPT |       10 |
|   1 |      F |       20 |
|   2 |   FEYE |       20 |
|   1 |      K |       20 |
|   2 |   PANW |       20 |

是使用此查询生成的,其中(我假设)您希望为您计算的SEQ列:

select
       1 + mod(rn,2) Seq
     , ticker
     , industry
from (
      select
             ticker
           , industry
           , 1+ row_number() over (partition by industry
                                   order by ticker) rn
      from stocks
     ) 
order by industry, rn

请注意,这是Jon Heller早期答案的衍生产品,此衍生产品可在http://sqlfiddle.com/#!4/088271/1

在线找到