Как выполнить группировку с условием удаления строк - PullRequest
0 голосов
/ 28 мая 2020

У меня есть таблица с тремя столбцами: ID, Компания, Результат, например:

Original Table

Я хочу сгруппировать по идентификатору / компании с помощью условие, если для одного и того же идентификатора есть результаты «Найдено» и «Не найдено» в одной и той же компании, я хочу видеть только строку, в которой результатом является «Найдено».

Я должен иметь возможность получать результаты по одной и той же теме в разных компаниях, но в случае наличия нескольких строк комбинации ID / Компания вижу только те строки, где результат «Найден»

Ожидаемый результат должен быть таким:

Expected result

Как я могу это сделать? Это своего рода группа в сочетании с удалением.

Ответы [ 2 ]

1 голос
/ 28 мая 2020

Вашему объяснению немного трудно следовать, но, основываясь на ваших данных, я думаю, что вам просто нужна агрегация и min():

select id, company, min(result) result
from mytable
group by id, company

Почему это работает, потому что, по строкам, 'Found' меньше, чем 'Not Found' (поскольку первый начинается с 'F', а второй начинается с 'N'). Поэтому, если в группе присутствуют оба значения, min() возвращает 'Found'. Если присутствует только одно значение, оно возвращается как есть.

0 голосов
/ 28 мая 2020

Кажется, вам нужны результаты на id / company. Один относительно простой способ:

select t.*
from t
where t.result = 'Found' or
      not exists (select 1
                  from t t2
                  where t2.id = t.id and t2.company = t.company and t2.result = 'Found'
                 );

С индексом на (id, company, result) это может быть самый быстрый подход.

Вы также можете структурировать это как приоритизацию:

select t.*
from (select t.*,
             rank() over (partition by id, company
                          order by result   -- "Found" is before "Not Found"
                         ) as seqnum
      from t
     ) t
where seqnum = 1;

Оба они позволяют возвращать любое количество столбцов - хотя для трех столбцов и не более одной строки на комбинацию компания / идентификатор вы можете использовать подход агрегирования, как предлагает GMB.

...