在 mysql 中选择不同的 5 列组合
Selecting distinct 5 columns combination in mysql
我有一个 mysql table 看起来像这样:第 1 列是唯一的。
1 value1 value2 0 2
2 value1 value2 1 3
3 value3 value4 3 2
4 value4 value5 4 1
5 value3 value4 3 1
我需要查询 select 具有不同列 1 和 2 的所有行,例如我想要的此示例的输出如下所示:
1 value1 value2 0 2
3 value3 value4 3 2
4 value4 value5 4 1
我需要不同的第 1 列和第 2 列,但所有列的组合总是不同的。我想显示不同的第 1,2 列和第 3 列,而不重复第 2,3 列。
我找到了一些关于如何操作的示例,但它们在每一列上都 select 不同。我也尝试了很多 Whosebug 的答案。但是我的问题不一样。
一种表现良好的方法是关联子查询:
select t.*
from t
where t.col1 = (select min(t2.col1)
from t t2
where t2.col2 = t.col2 and t2.col3 = t.col3
);
为了获得最佳性能,您需要在 (col2, col3, col1)
上建立索引。
我强烈建议在所有表上都设置一个主键,但如果您没有主键,那么 row_number()
是可行的方法:
select t.*
from (select t.*,
row_number() over (partition by col2, col3 order by col2) as seqnum
from t
) t
where seqnum = 1;
这会产生更多的开销,因为在仅过滤第一行之前,需要将行号分配给所有行。
可以通过ROW_NUMBER
:
来实现
SELECT *
FROM (SELECT *, ROW_NUMBER() OVER(PARTITION BY col2, col3 ORDER BY col1) AS rn
FROM tab) sub
WHERE rn=1
我有一个 mysql table 看起来像这样:第 1 列是唯一的。
1 value1 value2 0 2
2 value1 value2 1 3
3 value3 value4 3 2
4 value4 value5 4 1
5 value3 value4 3 1
我需要查询 select 具有不同列 1 和 2 的所有行,例如我想要的此示例的输出如下所示:
1 value1 value2 0 2
3 value3 value4 3 2
4 value4 value5 4 1
我需要不同的第 1 列和第 2 列,但所有列的组合总是不同的。我想显示不同的第 1,2 列和第 3 列,而不重复第 2,3 列。
我找到了一些关于如何操作的示例,但它们在每一列上都 select 不同。我也尝试了很多 Whosebug 的答案。但是我的问题不一样。
一种表现良好的方法是关联子查询:
select t.*
from t
where t.col1 = (select min(t2.col1)
from t t2
where t2.col2 = t.col2 and t2.col3 = t.col3
);
为了获得最佳性能,您需要在 (col2, col3, col1)
上建立索引。
我强烈建议在所有表上都设置一个主键,但如果您没有主键,那么 row_number()
是可行的方法:
select t.*
from (select t.*,
row_number() over (partition by col2, col3 order by col2) as seqnum
from t
) t
where seqnum = 1;
这会产生更多的开销,因为在仅过滤第一行之前,需要将行号分配给所有行。
可以通过ROW_NUMBER
:
SELECT *
FROM (SELECT *, ROW_NUMBER() OVER(PARTITION BY col2, col3 ORDER BY col1) AS rn
FROM tab) sub
WHERE rn=1