假设我有一个客户地址表:
+-----------------------+------------------------+
| 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
查询中,以便根据服务器之前是否已经看到该列值进行过滤?
发布于 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
发布于 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
发布于 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 by
是desc
,那么它将选择AddressLine
按字母顺序排在最后的CName
。
https://stackoverflow.com/questions/4662464
复制相似问题