sql - 如何为列的每个唯一值仅选择前行?

标签 sql sql-server tsql select greatest-n-per-group

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

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

在表中,像 John Smith 这样的一个客户可以拥有多个地址。 我需要此表的 SELECT 查询仅返回“CName”中存在重复项的第一行。对于此表,它应该返回除第三行(或第一行 - 这两个地址中的任何一个都可以,但只能返回一个)之外的所有行。

是否可以将关键字添加到 SELECT 查询中,以根据服务器之前是否已看到该列值进行过滤?

最佳答案

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

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

关于sql - 如何为列的每个唯一值仅选择前行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4662464/

相关文章:

mysql - SQLzoo JOIN 教程 #13

sql - 如何在存储过程中获取sql错误

SQL Server - 每个状态提取 X 条随机记录

php - 如何在MYSQL/SQL中查询本例的数据?

php - 整个站点的单一类别表或不同用例的不同表

sql - 限制 Sqlite 数据库中的记录数

sql-server - 检查 SQL 中的 GUID 是否为空

sql - 将参数从存储过程传递到函数(在存储过程中)

SQL获取电话号码序列

sql - varchar 到数字 :Error converting data type varchar to numeric