首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何为列的每个唯一值只选择前几行?

如何为列的每个唯一值只选择前几行?
EN

Stack Overflow用户
提问于 2011-01-12 04:48:14
回答 6查看 314.3K关注 0票数 121

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

+-----------------------+------------------------+
|         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查询中,以便根据服务器之前是否已经看到该列值进行过滤?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-01-12 04:50:45

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

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
票数 145
EN

Stack Overflow用户

发布于 2011-01-12 05:08:04

在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
票数 31
EN

Stack Overflow用户

发布于 2018-03-01 19:49:01

您可以像这样使用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,可以选择AddressLine按字母顺序排在第一位的CName。如果order bydesc,那么它将选择AddressLine按字母顺序排在最后的CName

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4662464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档