Есть ли в Oracle какой-либо способ пропустить значение в выборе, когда оно уже было показано?

#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>