如何通过名称选择不同的记录?

时间:2010-08-20 13:58:01

标签: sql-server

我的表Tags有这些记录

Application   ID                                      TagName
/Blogs        A75FB4D9-B0A2-45B1-A58D-9CC4E7FC1482    TagA
/News         E1BDEF9D-4285-464F-88DC-00495B59D2AE    TagA
/News         997F1721-335B-477A-9943-B91F0C21DE74    TagB
/Blogs        BB1CEE87-AF8A-44D6-8A4B-EAB138BBEF10    TagB

我想只返回TagATagB的第一个匹配项,但返回的表必须与上面的内容完全相同(Application,ID,TagName),所以我希望它是:< / p>

/Blogs        A75FB4D9-B0A2-45B1-A58D-9CC4E7FC1482    TagA
/News         997F1721-335B-477A-9943-B91F0C21DE74    TagB

我该怎么做?

3 个答案:

答案 0 :(得分:7)

SQL Server 2005 +

 SELECT Application, Id, TagName
 FROM
 (SELECT Application, Id, TagName,
  ROW_NUMBER()  OVER (partition by TagName order by TagName) rn
  FROM Table
 ) x 
 WHERE rn =1

答案 1 :(得分:1)

这可能会成功......

SELECT MIN(Application), MIN(ID), TagName FROM Table GROUP BY TagName

在此示例中,您将获得一个不可预测的ID ...

答案 2 :(得分:0)

在提供非SQL服务器特定答案的过程中

SELECT Application, Id, TagName
FROM Tags t
JOIN (
    SELECT Application, TagName, MAX(InsertOrder) LatestInsert
    FROM Tags
    GROUP BY Application, TagName
) l ON l.Application = t.Application AND l.TagName = t.TagName AND l.LatestInsert = t.InsertOrder

这假定列的存在允许您识别“第一个”匹配 - 请注意,如果这是一个时间戳,则可能有两个具有相同插入时间的记录