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

时间:2011-01-11 20:48:14

标签: sql sql-server tsql select unique

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

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

在表格中,像John Smith这样的客户可以拥有多个地址。 我需要这个表的select查询只返回'CName'中有重复项的第一行。对于这个表,它应该返回除第3个(或第1个)之外的所有行 - 这两个地址中的任何一个都可以,但只能返回一个。 是否有一个关键字我可以添加到SELECT查询中,根据服务器是否已经看到之前的列值进行过滤?

6 个答案:

答案 0 :(得分:110)

如果您说您不关心使用哪个地址,这是一个非常简单的答案。

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

答案 1 :(得分:21)

在SQL 2k5 +中,您可以执行以下操作:

;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

答案 2 :(得分:9)

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

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

答案 3 :(得分:4)

您可以使用row_numer() 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

答案 4 :(得分:0)

这将为您每个重复行提供一行。它还将为您提供位类型列,并且至少在MS Sql Server中有效。

(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。 希望这会有所帮助

答案 5 :(得分:-1)

要从客户表中获取每个唯一值,请使用

SELECT DISTINCT CName FROM customertable;

更深入地了解 w3schools:https://www.w3schools.com/sql/sql_distinct.asp