繁体   English   中英

SQL DISTINCT值问题

[英]SQL DISTINCT Value Question

如何在查询中过滤结果?

我有5条记录

约翰·史密斯,苹果
简,DOE,苹果
弗雷德·詹姆斯,苹果
比尔·埃文斯,橙色
Willma,琼斯,葡萄

现在我想要一个查询,该查询将使用DISTINCT FRUIT带回3条记录,但是...这是棘手的部分,我仍然想要First Name,Last Name的列。 PS:我不在乎它返回的3个值中的哪个,但是我需要它仅返回3个(或返回多少个DISTINCT水果)。

退货将是

约翰·史密斯,苹果
比尔·埃文斯,橙色
Willma,琼斯,葡萄

在此先感谢,我整天都在努力。

奇怪的是,最好的解决方案不涉及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;

如果数据量很少(没有成千上万的行),则可以执行子查询。

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

只是另一个解决方案

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM