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_id
和 consecutive_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
我需要一些帮助 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_id
和 consecutive_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