выбрать уникальные строки GROUP_CONCAT-ed на основе другого столбца - PullRequest
0 голосов
/ 03 февраля 2019

Данная таблица может иметь следующие строки.

т.е. для данного filename может быть два уникальных version_id (s).

file_id    version_id      filename
1          OS_v1           abc.update
1          App_v1          abc.update
2          OS_v2           xyz.update
2          App_v2          xyz.update
3          OS_v1           abc(1).update
3          App_v1          abc(1).update

PRIMARY KEY (`version_id`, `filename`)

Как обнаружить, что нет двух разных имен файлов, имеющих одинаковую комбинацию OS_App (версии)?

В данном примере строка, заданная с помощью file_id=3, является дубликатом file_id=1.

Примечание. Отдельные столбцы для ОС и версии приложения легко определить, но этотребуется много изменений кода, которые мы не хотели бы проходить.

Вопрос: существует ли запрос SELECT, который будет возвращать только file_id = 1 и file_id = 2 и пропускать file_id = 3?

До сих пор я придумал этот запрос, который выбирает комбинацию version_id, сгруппированную по filename, но строка-2 является дубликатом строки-1

SELECT   DISTINCT(GROUP_CONCAT(version_id SEPARATOR '-')) ,
         filename
FROM     schema_name.table_name
GROUP BY filename;

Возвращает:

concat_version patch_filename
OS_V1-APP_V1   xyz.update
OS_V2-APP_V2   abc(1).update
OS_V1-APP_V1   abc.update

1 Ответ

0 голосов
/ 03 февраля 2019

Вопрос: существует ли запрос SELECT, который вернул бы просто file_id = 1 и file_id = 2 и пропустил file_id = 3

Если вы используете MySQL 8.0, вы можете воспользоватьсяоконная функция ROW_NUMBER():

SELECT x.file_id, x.version_id, x.filename
FROM (
    SELECT t.*, ROW_NUMBER() OVER(PARTITION BY version_id ORDER BY file_id) rn
    FROM master_logs.system_patches t    
) x
WHERE x.rn = 1

Внутренний запрос назначает номер строки каждой записи в version_id группах, упорядоченных по file_id, а внешний запрос фильтрует записи с номером строки 1.


В более ранних версиях MySQL одним из типичных решений является использование коррелированного подзапроса с условием NOT EXISTS для фильтрации нежелательных записей:

SELECT t.file_id, t.version_id, t.filename
FROM master_logs.system_patches t 
WHERE NOT EXISTS (
    SELECT 1 
    FROM master_logs.system_patches t1
    WHERE t1.version_id = t.version_id AND t1.file_id < t.file_id
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...