如何为列的每个唯一值仅选择第一行?

假设我有一张客户地址表:

+-----------------------+------------------------+
|         CName         |      AddressLine       |
+-----------------------+------------------------+
|  John Smith           |  123 Nowheresville     |
|  Jane Doe             |  456 Evergreen Terrace |
|  John Smith           |  999 Somewhereelse     |
|  Joe Bloggs           |  1 Second Ave          |
+-----------------------+------------------------+

在表中,像约翰 · 史密斯这样的客户可以有多个地址。 我需要这个表的 SELECT查询只返回在“ CName”中有重复的第一行。对于这个表,它应该返回除第3行(或第1行——这两个地址中的任何一个都可以,但只能返回一个)之外的所有行。

是否有一个关键字,我可以添加到 SELECT查询过滤基于是否服务器已经看到列值之前?

356576 次浏览

一个非常简单的答案,如果你说你不在乎使用哪个地址。

SELECT
CName, MIN(AddressLine)
FROM
MyTable
GROUP BY
CName

如果您想要根据,比如说,一个“插入”列的第一个,那么它是一个不同的查询

SELECT
M.CName, M.AddressLine,
FROM
(
SELECT
CName, MIN(Inserted) AS First
FROM
MyTable
GROUP BY
CName
) foo
JOIN
MyTable M ON foo.CName = M.CName AND foo.First = M.Inserted

在 SQL2k5 + 中,您可以执行以下操作:

;with cte as (
select CName, AddressLine,
rank() over (partition by CName order by AddressLine) as [r]
from MyTable
)
select CName, AddressLine
from cte
where [r] = 1

可以使用 row_number()获取行号。它使用 over命令-partition by子句指定何时重新启动编号,而 order by选择对行号进行排序。即使在查询的末尾添加了 order by,它也会在编号时保留 over命令中的顺序。

select *
from mytable
where row_number() over(partition by Name order by AddressLine) = 1

您可以这样使用 row_number() over(partition by ...)语法:

select * from
(
select *
, ROW_NUMBER() OVER(PARTITION BY CName ORDER BY AddressLine) AS row
from myTable
) as a
where row = 1

这样做的目的是创建一个名为 row的列,这是一个计数器,每次看到相同的 CName时都会增加一个值,并通过 AddressLine对这些事件进行索引。通过强制 where row = 1,可以选择 CName,其中 AddressLine按字母顺序排在第一位。如果 order bydesc,那么它就会选择 CName,它的 AddressLine按字母顺序排在最后。

这将为每个重复行提供一行。它还将提供位类型列,并且它至少在 MSSqlServer 中可以工作。

(select cname, address
from (
select cname,address, rn=row_number() over (partition by cname order by cname)
from customeraddresses
) x
where rn = 1) order by cname

如果您想找到所有的副本,只需将 rn = 1更改为 rn > 1。 希望这个能帮上忙

要从客户表中获得每一个独特的价值,请使用

SELECT DISTINCT CName FROM customertable;

更深入的 w3school: https://www.w3schools.com/sql/sql_distinct.asp

选择金额从(SELECT DISTINCT (金额)从订单订单金额下限3)订单金额下限1;