Оракул запрос чередующихся записей
У меня есть таблица, которая выглядит так:
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 для полного примера. (Это не совсем соответствует вашим результатам в примере, но либо результаты вашего примера неверны, либо в этом вопросе есть что-то еще, что я не понимаю.)