SQL DISTINCT Значение Вопрос - PullRequest
1 голос
/ 03 июня 2010

Как я могу отфильтровать результаты в запросе? Пример

У меня 5 записей

Джон Смит, яблоко
Джейн, Doe, яблоко
Фред, Джеймс, яблоко
Билл, Evans, оранжевый
Уиллма, Джонс, виноград

Теперь я хочу запрос, который вернул бы мне 3 записи с DISTINCT FRUIT, НО ... и вот сложная часть, я все еще хочу столбцы для Имя, Фамилия. PS Мне все равно, какой из трех он возвращает, но мне нужно, чтобы он только возвратил 3 (или сколько вообще DISTINCT фруктов).

бывший возврат будет

Джон Смит, яблоко
Билл, Evans, оранжевый
Willma, Джонс, виноград

Заранее спасибо, я весь день бился об это.

Ответы [ 4 ]

3 голосов
/ 03 июня 2010

Как ни странно, лучшее решение не включает 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 голосов
/ 03 июня 2010
SELECT DISTINCT x.*,fruit FROM peopleFruit pf 
CROSS APPLY  
(SELECT TOP 1 firstname, lastname FROM peopleFruit pf1 WHERE pf.fruit=pf1.fruit) x 
0 голосов
/ 03 июня 2010

Просто еще одно решение

    select distinct x.*,fruit from t1 
    cross apply 
    (select top 1 firstname, lastname from t1 t2 where t1.fruit=t2.fruit) x
0 голосов
/ 03 июня 2010

Если у вас небольшой объем данных (не десятки тысяч строк), вы можете выполнять подзапросы.

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')
...