MySQL: обеспечить последовательность номеров в столбце - PullRequest
1 голос
/ 14 мая 2019

Мне нужна помощь для запроса MySQL.

Предположим, у нас есть таблица со столбцами «id», «unique_id» и «consecutive_id». Числа в столбце "id" НЕ всегда являются последовательными, в то время как мы должны сохранять последовательность в столбце "последовательный_идентификатор". Обычно каждая строка должна иметь свой собственный порядковый номер, но иногда могут встречаться строки, которые должны иметь одинаковый порядковый номер. Такие строки имеют одинаковое значение в столбце «unique_id». Мне нужен запрос, чтобы найти первый идентификатор строки, которая имеет более одной строки с одинаковым последовательным идентификатором и уникальным идентификатором, который не является частью другой строки.

In создал небольшую скрипку на https://www.db -fiddle.com / f / hy8SACLyM2D65H2ZY31c2f / 0 , чтобы продемонстрировать мою проблему. Как видите, идентификаторы 3 и 5 имеют одинаковый последовательный номер (2). Это нормально, поскольку у них один и тот же уникальный идентификатор. Идентификаторы 9, 10, 12 и 14 также имеют одинаковый последовательный номер (4), но только идентификаторы 9 и 10 имеют идентичный уникальный идентификатор. Поэтому в этом случае запрос должен найти идентификатор 12.

Не могли бы вы помочь мне с разработкой решения для этого?

Большое спасибо за вашу помощь заранее.

Всего наилучшего,

Marianne

1 Ответ

0 голосов
/ 14 мая 2019

Вы можете использовать COUNT(DISTINCT unique_id), чтобы найти значения consecutive_id, которые имеют различные unique_id.

SELECT consecutive_id
FROM test 
GROUP BY consecutive_id 
HAVING COUNT(DISTINCT unique_id) > 1 

Затем вы можете объединить это с вашей исходной таблицей, сгруппировать по unique_id и consecutive_id и получить строки, у которых просто есть счет 1, что означает, что они не равны остальным группа.

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

SELECT consecutive_id, MIN(id) as id
FROM (
    SELECT a.consecutive_id, MIN(id) AS id
    FROM test AS a
    JOIN (
        SELECT consecutive_id
        FROM test 
        GROUP BY consecutive_id 
        HAVING COUNT(DISTINCT unique_id) > 1) AS b
    ON a.consecutive_id = b.consecutive_id
    GROUP BY a.consecutive_id, a.unique_id
    HAVING COUNT(*) = 1) AS x
GROUP BY consecutive_id

DEMO

...