MySQL:保证一列数字的连续性

MySQL: Ensure consecutiveness of numbers in a column

我需要一些帮助 MySQL 查询。

假设我们有一个 table,其中包含 "id"、"unique_id" 和 "consecutive_id" 列。 "id" 列中的数字并不总是连续的,而我们必须保持 "consecutive_id" 列中的连续性。基本上每一行都应该有自己的连续编号,但有时可能会出现共享相同连续编号的行。这些行在列 "unique_id" 中具有相同的值。我需要一个查询来查找具有多个具有相同连续 ID 的行的第一个 ID 和一个不属于另一行的唯一 ID。

我在 https://www.db-fiddle.com/f/hy8SACLyM2D65H2ZY31c2f/0 创建了一个 fiddle 来演示我的问题。如您所见,ID 3 和 5 具有相同的连续数字 (2)。没关系,因为它们共享相同的唯一 ID。 ID 9、10、12 和 14 也具有相同的连续编号 (4),但只有 ID 9 和 10 具有相同的唯一 ID。因此在这种情况下,查询应该找到 ID 12。

你能帮我开发一个解决方案吗?

非常感谢您的提前帮助。

祝一切顺利,

玛丽安

您可以使用 COUNT(DISTINCT unique_id) 来查找具有不同 unique_id.

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

然后您可以将其与原始 table 合并,按 unique_idconsecutive_id 分组,并获取计数为 1 的行,这意味着他们不等于其他人。

由于可能存在多个离群值,因此您需要另一个级别的子查询,它只获取每个连续 ID 的最小离群值。

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