Фильтрация дубликатов после UNION - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть 2 таблицы: Activities & Edited они почти одинаковые, но Edited содержит несколько дополнительных столбцов, которые позволяют обрабатывать данные в автономном режиме. Запись может быть в одной из таблиц или в обеих.

Мне нужно взять набор данных, который будет содержать только уникальный activityKey. Последний результат должен быть основан на editDate. Например:

SELECT activityKey, editDate, deleted
FROM activities
WHERE projectID = '4'  
AND deleted = 0
UNION
SELECT activityKey, editDate, deleted
FROM edited
WHERE projectID = '4' 
ORDER BY editDate DESC
LIMIT 20 OFFSET 0

enter image description here

Но он собирает данные только из обеих таблиц. И я получаю дубликаты, как на скриншоте: WO-981 & WO-924. Вопрос: Как я могу удалить эти дубликаты и использовать только самые новые записи, основанные на editDate. Кроме того, мне нужно удалить запись, если deleted = 1 в editDate и deleted = 0 в activities таблице, как в WO-924, она должна быть удалена.

1 Ответ

1 голос
/ 09 апреля 2020

Для этого можно использовать агрегацию, если deleted принимает только значения 0 и 1:

SELECT activityKey, editDate,
       (CASE WHEN MAX(CASE WHEN deleted = 0 THEN editDate END) = MAX(editDate)
             THEN 0 ELSE 1
        END) as deleted
FROM (SELECT activityKey, editDate, deleted
      FROM activities
      WHERE projectID = '4' AND deleted = 0
      UNION ALL
      SELECT activityKey, editDate, deleted
      FROM edited
      WHERE projectID = '4' 
     ) ae
GROUP BY activityKey
ORDER BY MAX(editDate) DESC
LIMIT 20 OFFSET 0;

Более общее решение заключается в использовании ROW_NUMBER(), но в этом случае это работает .

РЕДАКТИРОВАНИЕ:

Если вы хотите пропустить строки с deleted = 1, добавьте предложение HAVING:

SELECT activityKey, editDate,
       (CASE WHEN MAX(CASE WHEN deleted = 0 THEN editDate END) = MAX(editDate)
             THEN 0 ELSE 1
        END) as deleted
FROM (SELECT activityKey, editDate, deleted
      FROM activities
      WHERE projectID = '4' AND deleted = 0
      UNION ALL
      SELECT activityKey, editDate, deleted
      FROM edited
      WHERE projectID = '4' 
     ) ae
GROUP BY activityKey
HAVING MAX(editDate) = MAX(CASE WHEN deleted = 1 THEN editDate END)
ORDER BY MAX(editDate) DESC
LIMIT 20 OFFSET 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...