Оракул запрос чередующихся записей

У меня есть таблица, которая выглядит так:

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 и 2 следующим образом:

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

Таким образом, в основном, сгруппированные по одному отраслевому коду, чередуются между 1 и 2 записями.

Не могу понять, как.

2 ответа

Не вижу, как вы пришли к примеру результата в вашем вопросе, но этот результат:

| 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

Обратите внимание, что это производная от более раннего ответа Джона Хеллера, эту производную можно найти в Интернете по адресу http://sqlfiddle.com/.

Используйте аналитическую функцию для создания номера строки, который начинается заново для каждой группы (отрасль и последовательность), а затем сортируйте по этому номеру строки.

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

Посмотрите эту SQL Fiddle для полного примера. (Это не совсем соответствует вашим результатам в примере, но либо результаты вашего примера неверны, либо в этом вопросе есть что-то еще, что я не понимаю.)

Другие вопросы по тегам