这是我的测试用例
CREATE TABLE matches AS
SELECT 1 s, 2 d
UNION SELECT 1, 3 -- (1,2) preferred
UNION SELECT 2, 2 -- (1,2) preferred
UNION SELECT 2, 3
UNION SELECT 3, 3 -- (2,3) preferred
UNION SELECT 3, 4;
我想过滤此表并仅保留每个 s 或 d 值一次,优先考虑最小的 (s,d) 对。结果应为(1,2),(2,3),(3,4)
。
如何有效地做到这一点?
我尝试了下面的查询,但只有当与不同 s 值关联的 d 值不重叠时它才有效
SELECT * FROM (
SELECT
*,
row_number() OVER (PARTITION BY s ORDER BY d) rs,
row_number() OVER (PARTITION BY d ORDER BY s) rd
FROM matches
) t
WHERE rd = rs;
任何帮助将不胜感激。
最佳答案
如果我正确地解释了您的意图,您可以通过将表复制到一个新的(可能是临时的)表来实现此目的,该表在 s
和 d
上具有唯一索引并使用 INSERT IGNORE
复制数据:
CREATE TABLE matches AS
SELECT 1 s, 2 d
UNION SELECT 1, 3 -- (1,2) preferred
UNION SELECT 2, 2 -- (1,2) preferred
UNION SELECT 2, 3
UNION SELECT 3, 3
UNION SELECT 3, 4;
CREATE TABLE matches2 (s INT, d INT);
ALTER TABLE matches2 ADD UNIQUE KEY (s), ADD UNIQUE KEY(d);
INSERT IGNORE INTO matches2
SELECT * FROM matches ORDER BY s, d;
SELECT * FROM matches2
输出:
s d
1 2
2 3
3 4
关于mysql - 如何从 (s,d) 对表中有效过滤 s 和 d 的重复值,仅保留最小的 (s,d) 对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52404942/