【问题标题】:What is the difference between GROUP BY and DISTINCT?GROUP BY 和 DISTINCT 有什么区别?
【发布时间】:2010-12-15 18:15:43
【问题描述】:

我有以下数据的表格

empid   empname deptid   address
--------------------------------
aa76    John     6       34567
aa75    rob      4       23456
aa71    smith    3       12345
aa74    dave     2       12345
a77     blake    2       12345
aa73    andrew   3       12345
aa90    sam      1       12345
aa72    will     6       34567
aa70    rahul    5       34567

我使用了以下查询:

select deptid, EMPID ,EMPNAME ,ADDRESS
from mytable
group by 1,2,3,4

结果如下:

deptid  empid  empname address
------------------------------
1       aa90   sam      12345
2       aa74   dave     12345
2       aa77   blake    12345
3       aa71   smith    12345
3       aa73   andrew   12345
4       aa75   rob      23456
5       aa70   rahul    34567
6       aa76   John     34567
6       aa72   will     34567

对于查询:

select distinct (deptid),EMPID,EMPNAME,ADDRESS
from mytable

结果集是:

deptid empid empname address   
----------------------------
1      aa90  sam     12345
2      aa74  dave    12345
2      aa77  blake   12345
3      aa71  smith   12345
3      aa73  andrew  12345
4      aa75  rob     23456
5      aa70  rahul   34567
6      aa72  will    34567
6      aa76  John    34567

在第二个查询中,虽然我已经为 DEPTID 提供了DISTINCT,但我怎么会得到重复的 DEPTID...

你能解释一下吗?

【问题讨论】:

  • 我想你需要先解释一下你期待什么结果? DISTINCT 适用于所有列。因此,即使 deptid 相同,您的第二个查询也会为您提供 2 个唯一的数据行。将 GROUP BY 用于计数或求和等聚合函数。
  • 在 SELECT 子句中按位置引用列称为序数。 IE:group by 1,2,3,4 - 如果 SELECT 列发生变化,不建议这样做。
  • 作为旁注;在 Teradata 13.10(和更早版本)上,使用 DISTINCT 可能会导致排序操作,这比 GROUP BY 慢。因此,从性能的角度来看,应该尽可能选择 GROUP BY 而不是 DISTINCT。我认为这在 14.10 版本中已修复。

标签: sql teradata


【解决方案1】:

DISTINCT 消除重复行。 GROUP BY 对唯一记录进行分组,并允许您执行聚合功能。

【讨论】:

    【解决方案2】:

    DISTINCT 指的是整个不同的记录,而不是记录中的不同字段。

    【讨论】:

    • 这是我很困惑..我期待不同的返回不同的列...它现在为我清除了..
    【解决方案3】:

    DISTINCT 仅适用于整行。不要被误导认为SELECT DISTINCT(A), B 做了一些不同的事情。这相当于SELECT DISTINCT A, B

    【讨论】:

      【解决方案4】:

      虽然 group by 所有列和 distinct 将在 Teradata 中为您提供相同的结果,但它们在后台使用不同的算法,通常使用 group by 比使用 distinct 可以获得更好的性能。我相信有计划以相同的方式实施,但在我使用的版本 (v2r6) 中它们仍然不同,而且我还没有在 Teradata 12 上尝试过。

      【讨论】:

      • 在此处查看优化器如何处理 GROUP BY 与 DISTINCT 之间的解释:forums.teradata.com/forum/enterprise/… 似乎在 Teradata 13 中,优化器提高了 DISTINCT 的性能,如链接所示以上。
      【解决方案5】:

      Group By 和 Distinct 都将工作相同。与 Distinct Group By 相比提供了良好的性能,因为它处理较少的行并占用较少的假脱机内存

      【讨论】:

        【解决方案6】:

        Distinct 不适用于多列。虽然在单个列上给出了不同的,但它给出了指定列的唯一组合。

        所以,Group by 给出了唯一的记录并且也可以进行聚合。

        【讨论】:

          【解决方案7】:

          我不知道如何解释差异,但我给你提供了_with_queries_的例子,通过这个你可以更好地理解GROUP BYDISTINCT之间的区别。

          问题:customers 表中每个唯一状态有多少人

          select distinct(state), count(*) from customers;
          
          RESULT
          
          Washington  17
          ----------------------------------------------------------
          
          select State, count(*) from customers GROUP BY STATE;
          
          RESULT
          
          **Arizona    6
          Colorado         2
          Hawaii           1
          Idaho            1
          North Carolina   1
          Oregon           2
          Sourth Carolina  1
          Washington   2
          Wisconsin    1**
          

          只需制作自己的表格并检查结果

          【讨论】:

          • 这绝对不是 Teradata 中的结果(也不应该出现在其他 DBMS 中),它会导致语法错误。您使用了哪个 DBMS? MySQL?
          猜你喜欢
          • 2010-09-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-11-23
          • 2017-01-20
          相关资源
          最近更新 更多