2009-11-12 110 views
3

我有以下数据GROUP BY和DISTINCT有什么区别?

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 

在第二个查询,虽然我已经给DISTINCT为DEPTID,我怎么就得到了重复DEPTID ...

你能解释一下吗?

+1

我想你需要先解释一下什么结果你期待? DISTINCT适用于所有列。所以即使deptid相同,第二个查询也会为您提供2个唯一的数据行。使用GROUP BY作为计数或总和等聚合函数。 – Rahul 2009-11-12 05:40:50

+0

对于什么数据库? – 2009-11-12 05:41:50

+1

在SELECT子句中按位置引用一列称为序数。 IE:'1,2,3,4组' - 不建议在SELECT列发生变化时使用。 – 2009-11-12 05:43:12

回答

6

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

+0

这是我很困惑..我期待不同的返回不同的列...现在清除我.. – SrinivasR 2009-11-12 08:55:00

9

DISTINCT消除重复行。 GROUP BY分组记录,并允许您执行聚合函数。

1

尽管在所有列和不同的组中都会给Teradata带来相同的结果,但它们在幕后有不同的算法,并且通常使用group by会比使用distinct更好。我相信有计划以同样的方式实施,但在我使用的版本(v2r6)中它们仍然不同,我还没有尝试过Teradata 12。

+1

请参阅优化器在这里处理如何处理GROUP BY与DISTINCT之间的解释:http:// forums。 teradata.com/forum/enterprise/distinct-vs-group-by-insert-vs-create-as 看来,在Teradata 13中,优化器提高了DISTINCT的性能的地方,正如上面的链接所示。 – 2010-03-19 03:42:06

-1

不同的多列不能正常工作。尽管在单列上有明显的区别,但它给出了指定列的唯一组合。

所以,Group by给出了独特的记录,也可以做聚合。

2

DISTINCT只适用于整行。不要误入思维SELECT DISTINCT(A), B做一些不同的事情。这相当于SELECT DISTINCT A, B

0

集团By和Distinct都将工作相同。与不同组相比,性能良好,因为它可以处理较少的行并占用较少的后台内存。

-1

我不知道如何解释差异,但我通过此示例给出示例_with_queries_,您可以更好地理解GROUP BYDISTINCT

问:有多少人是在客户表中的每个唯一的状态

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

只是让自己的表和检查结果

+0

这绝对不是Teradata的结果(并且不应该在其他DBMS中),它会导致语法错误。你使用了哪个DBMS? MySQL的? – dnoeth 2014-03-15 16:52:26