【问题标题】:Find distinct values from two columns从两列中查找不同的值
【发布时间】:2014-09-16 10:49:24
【问题描述】:

我有一张这样的桌子......

A        B
100      423
100      423
323      123
323      153
323      153
521      321
521      321
321      321

我如何编写一个查询以便它只获得唯一的 A 和 B? 我希望结果看起来像这样。

A        B
100      423
323      123
323      153
521      321
321      321

到目前为止,我只能使用一列的唯一性对其进行分组

select * from ABtable group by A

这给了

A        B
100      423
323      123
521      321

或者...

select * from ABtable group by B

会回来

A        B
100      423
323      123
323      153
321      321

但不是两者兼而有之。

【问题讨论】:

  • SELECT DISTINCT blah blah blah - 但是这个“表”没有 PK,所以它不是真正的表。

标签: mysql sql


【解决方案1】:

您可以按多列分组...

Select *
From   ABTable
Group By A, B

根据表定义和可能的 where/have 子句,您可能会看到使用 distinct 来稍微提高性能

Select Distinct A, B
From   ABTable

基准测试并决定。

【讨论】:

  • 查询是等价的(如果数据库足够聪明,可以看到 * 与 group by 匹配。)为什么 distinct 会根据表定义表现更好?
  • 不确定,但几年前,我们在一个记录超过 1000 万条记录的表上从 Distinct 切换到 Group By,并且确实发现了显着的性能提升
【解决方案2】:

要拥有不同的行,您需要这样做

SELECT DISTINCT *
FROM ABTABLE

要按 A 分组,您需要为 B 选择一个聚合函数,就像 SUM,AVG,MAX,MIN,COUNT 等...在您的输出示例中,您正在使用MIN,那么查询将是:

SELECT A, MIN(B)
FROM ABTABLE
GROUP BY A

如果你想计算 B 元素,你会使用:

SELECT A, COUNT(B)
FROM ABTABLE
GROUP BY A

它会返回B中与NULL不同的元素个数

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-22
    • 1970-01-01
    • 2020-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多