Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql GROUP BY和DISTINCT之间有什么区别?_Sql_Teradata - Fatal编程技术网

Sql GROUP BY和DISTINCT之间有什么区别?

Sql GROUP BY和DISTINCT之间有什么区别?,sql,teradata,Sql,Teradata,我有以下数据的表格 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

我有以下数据的表格

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
将不同的记录作为一个整体引用,而不是记录中的不同字段。

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

虽然“按所有列分组”和“不同”将在Teradata中为您提供相同的结果,但它们在幕后有不同的算法,使用“按组分组”通常比使用“不同”获得更好的性能。我相信有计划以相同的方式实现这两个功能,但在我使用的版本(v2r6)中它们仍然不同,而且我还没有在Teradata 12上进行过尝试。

Distinct在使用多列时无法正常工作。虽然在单个列上给出了不同的值,但它给出了指定列的唯一组合


因此,Group by提供唯一的记录,也可以进行聚合。

DISTINCT
仅对整行有效。不要被误导,以为
选择DISTINCT(A),B
会做一些不同的事情。这相当于按Group By选择不同的A、B,这两个选项的作用相同。与Distinct Group By相比,它具有良好的性能,因为它处理的行数更少,占用的假脱机内存也更少。我不知道如何解释这一差异,但我给你举了一些例子,其中包含一些查询。通过这一点,你可以更好地理解
Group By
Distinct
之间的差异

问题:在客户表中,每个独特状态下有多少人

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**

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

我想您需要首先解释您期望的结果是什么?在所有列上都有不同的工作。因此,第二个查询为您提供了两行唯一的数据,即使deptid是相同的。将GROUP BY用于count或sum等聚合函数。在SELECT子句中按位置引用列称为序号。IE:
按1,2,3,4分组
-不建议在选择列更改的情况下进行分组。可能重复:作为旁注;在Teradata 13.10(以及更早的版本)上,使用DISTINCT可能会导致排序操作,这比GROUP BY慢。因此,从性能的角度来看,在可能的情况下,人们应该更喜欢分组而不是区分。我想这在14.10版本中是固定的。这是我被弄糊涂了。。我希望distinct返回distinct列。。。我现在明白了。请看优化器如何处理GROUP BY vs DISTINCT之间的解释:在Teradata 13中,优化器似乎提高了DISTINCT的性能,如上面的链接所示。这肯定不是Teradata中的结果(也不应该出现在其他DBMS中),这将导致语法错误。您使用了哪种数据库管理系统?MySQL?