2009-11-12 107 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