2010-06-03 88 views
1

如何過濾查詢中的結果?例如SQL DISTINCT值問題

我有5條

約翰·史密斯,蘋果
簡,DOE,蘋果
弗雷德·詹姆斯,蘋果
比爾埃文斯,橙色
Willma,瓊斯,葡萄

現在我想要一個查詢,將帶回我帶有DISTINCT FRUIT的3條記錄,但是......這裏是棘手的部分,我仍然希望列名爲First,Last名稱。 PS我不在乎其3的返回提醒你,但我也只需要返回3(或什麼都多少DISTINCT水果也有。

前收益將

約翰·史密斯,蘋果
比爾埃文斯,橙色
Willma,瓊斯,葡萄

感謝事先我已經一整天敲我的頭這一點。

回答

3

奇怪enou gh,最好的解決方案不涉及GROUP BY。

WITH DistinctFruit AS (
    SELECT 
     ROW_NUMBER() OVER (PARTITION BY Fruit ORDER BY LastName) AS FruitNo, 
     LastName, 
     FirstName, 
     Fruit 
    FROM table) 
SELECT FirstName, LastName, Fruit 
FROM DistinctFruit 
WHERE FruitNo = 1; 
+0

請問這是爲什麼比GROUP BY好?更快? 這看起來好像不太易讀/簡單,所以我認爲勝利在於表現? – DVK 2010-06-03 01:51:01

+0

如果您使用嵌套子查詢,可以使用GROUP BY做這件事,但這樣做根本不可讀,而且執行得非常糟糕。事實上,你甚至不需要GROUP BY的解決方案 - 你可以使用TOP和DISTINCT。 – 2010-06-03 02:04:22

+0

+1。尼斯CTE解決方案。 – 2010-06-03 05:17:46

0

如果您有少量數據(不是數萬行),則可以執行子查詢。

select distinct t1.fruit as Fruit, 
    (select top 1 t2.lastname 
    from t1 as t2 
    where t1.fruit = t2.fruit 
    order by t2.lastname) as LastName, 
    (select top 1 t2.firstname 
    from t1 as t2 
    where t1.fruit = t2.fruit 
    order by t2.lastname, t2.firstname) as FirstName 
from t1 

注意FirstName列的排序方式與LastName列的排序方式相同。這會給你一個正確的名字與正確的名字。

這裏是我的測試數據:

create table t1 
(firstname varchar(20), 
lastname varchar(20), 
fruit varchar(20)) 


insert into t1 
values ('John','Smith','apple') 
insert into t1 
values ('Jane','Doe','apple') 
insert into t1 
values ('Fred','James','apple') 
insert into t1 
values ('Bill','evans','orange') 
insert into t1 
values ('Willma','Jones','grape') 
0

只是另一種解決方案

select distinct x.*,fruit from t1 
    cross apply 
    (select top 1 firstname, lastname from t1 t2 where t1.fruit=t2.fruit) x 
0
SELECT DISTINCT x.*,fruit FROM peopleFruit pf 
CROSS APPLY 
(SELECT TOP 1 firstname, lastname FROM peopleFruit pf1 WHERE pf.fruit=pf1.fruit) x