我有一个看起来像这样的mysql表:Col 1是UNIQUE。
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
我需要一个查询来选择具有不同的列1和2的所有行,例如,我希望此示例的输出如下所示:
1 value1 value2 0 2
3 value3 value4 3 2
4 value4 value5 4 1
我需要不同的列1和2,但是所有列的组合总会总是不同的。我想显示不同的col 1,2和3,而无需重复col 2,3。
我已经找到了一些有关如何执行此操作的示例,但是它们在每一列上的选择都是不同的。我也尝试了许多stackoverflow答案。但是我的问题有所不同。
一种表现良好的方法是相关子查询:
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
来实现:
ROW_NUMBER