Я очень новичок в sqlplus, и у меня очень ограниченные знания по этому вопросу, может кто-нибудь, пожалуйста, помогите мне в этом:

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

Здесь есть два типа значений в столбце кода, например: ABC.1 и DEF.1. Здесь DEF.1 имеет значения для всех дат, но то же самое не верно для ABC.1, это пропускает значения для некоторых дат. Я пытаюсь написать запрос для извлечения данных, если есть значение в DEF.1 для конкретной даты, а значение отсутствует для ABC.1 для той же даты.

Пример:

+------------------------------+
| Code    Value     Date       |
+------------------------------+
| DEF.1    44       22-11-2019 |
+------------------------------+
| ABC.1    23       23-11-2019 |
+------------------------------+
| DEF.1    12       23-11-2019 |
+------------------------------+
| ABC.1    99       24-11-2019 |
+------------------------------+
| DEF.1    23       24-11-2019 |
+------------------------------+

Здесь ABC.1 не имеет значения для даты 22-11-2019, поэтому для этой даты я хочу извлечь значения DEF.1

0
Phoenix 27 Ноя 2019 в 10:46

2 ответа

Лучший ответ

Я хотел бы подойти к этому вопросу, используя not exists:

select t.*
from t
where t.code = 'DEF.1' and
      not exists (select 1
                  from t t2
                  where t2.date = t.date and t2.code = 'ABC.1'
                 );

С индексом (date, code) я ожидаю, что он будет иметь очень хорошую производительность.

0
Gordon Linoff 27 Ноя 2019 в 12:59

Самый простой и, вероятно, самый быстрый будет аналитическим count:

select code, value, date_
  from (
    select code, value, date_, 
           count(case code when 'ABC.1' then 1 end) over (partition by date_) c1,
           count(case code when 'DEF.1' then 1 end) over (partition by date_) c2
      from tbl t)
  where c1 <> c2

демонстрация dbfiddle

Вы также можете использовать not exists, not in и группирование, но если вам нужны подробности, аналитический способ самый короткий. Этот запрос показывает все строки, где count отличается, поэтому, если есть 3 ABC и 5 DEF, вы получите 8 строк на эту дату. Это также работает, если строки отсутствуют, как в вашем примере. Date зарезервированное слово, поэтому я добавил подчеркивание.

1
Ponder Stibbons 27 Ноя 2019 в 12:20