在 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