#sql #oracle #select
Вопрос:
Извините, потому что, возможно, это глупый вопрос, но, честно говоря, я не знаю, как с ним справиться. Давайте представим, что после выполнения выбора с группой по клаузуле у меня есть следующая информация:
col1 col2 col3
value1 optionA 1
value1 optionB 5
value2 optionA 3
value2 optionB 4
Но я хотел бы получить следующее:
col1 col2 col3
value1 optionA 1
optionB 5
value2 optionA 3
optionB 4
Другими словами, я не хочу показывать ранее показанное значение, если оно одинаковое (в данном случае значение 1 и значение 2).
Возможно ли это с помощью Oracle? если ответ утвердительный, не могли бы вы любезно указать мне правильное направление?
Спасибо.
Комментарии:
1. Да, но вам нужно сообщить нам, каковы критерии заказа.
2. Хотя вы можете сделать это в чистом SQL (как показывает @TheImpaler, 1), это то, что обычно немного подозрительно делать в чистом SQL. Какой бы инструмент у вас ни был для отображения результатов пользователю, у него, вероятно, есть варианты форматирования результатов. И это то, что обычно более уместно на уровне пользовательского интерфейса, чем в SQL (хотя бы потому, что пользователь пользовательского интерфейса может настроить его позже, когда кто-то захочет изменить способ отображения данных без необходимости работать с SQL).
Ответ №1:
Вы не говорите, каковы критерии упорядочения строк, поэтому я предположу, что это ( col1
, col2
).
Запрос, который вы хотите, должен выглядеть так:
select
case when col1 = lag(col1) over(order by col1, col2)
then null
else col1
end as col1,
col2,
col3
from t
Комментарии:
1. Извините, я не упомянул, но вы абсолютно правы. Критериями заказа будут col1 и col2. Я попробую и поблагодарю вас за вашу помощь. Очень признателен.
2. Это работает. Я не знал, что функции ОТСТАЮТ и ЛИДИРУЮТ, и они явно открывают новые горизонты. Большое вам спасибо за вашу помощь.
Ответ №2:
Если бы вы работали на SQL*Plus и использовали версию Oracle, которая не поддерживает аналитические функции, вы могли бы использовать ее команду break. Я думаю, что в наши дни это не так, а?
Первоначально:
SQL> with temp (col1, col2, col3) as
2 (select 'value1', 'optionA', 1 from dual union all
3 select 'value1', 'optionB', 5 from dual union all
4 select 'value2', 'optionA', 3 from dual union all
5 select 'value2', 'optionB', 4 from dual
6 )
7 select col1, col2, col3
8 from temp
9 order by col1, col2;
COL1 COL2 COL3
------ ------- ----------
value1 optionA 1
value1 optionB 5
value2 optionA 3
value2 optionB 4
Давай покончим с этим:
SQL> break on col1
SQL>
SQL> /
COL1 COL2 COL3
------ ------- ----------
value1 optionA 1
optionB 5
value2 optionA 3
optionB 4
SQL>