从表中返回最早的ID,包括其他行

时间:2014-10-19 10:24:55

标签: sql-server duplicates

鉴于此数据:

itemID  note        color   updateddate description
AA123   not unique  blue    2014-01-01  duplicate 1
AB789   unique      green   2013-11-20  unique 1
AA123   not unique  pink    2012-01-01  duplicate 2
CC123   unique      blue    2014-12-11  unique 2
CA123   unique      red     2014-08-06  unique 3
CB333   unique      red     2014-03-03  unique 4
CX123   unique      brown   2014-09-01  unique 5
XX111   not unique  red     2014-07-07  duplicate 3
XX111   not unique  yellow  2014-06-06  duplicate 4
XX111   not unique  purple  2014-05-05  duplicate 5

如何从中进行选择,完全返回所有行,但如果有重复的Id,我只想通过其更新日期返回最早的行?在MySQL我明白这很容易做到,但在MSSQL中我无法理解它。

2 个答案:

答案 0 :(得分:0)

您可以通过自我加入和CTE来实现这一目标:

WITH MinDates_CTE (itemD, MinDate) AS
(
    SELECT itemID,
           MIN(updatdate) AS MinDate
    FROM MyTable
    GROUP BY itemID
)

SELECT MyTable.*
FROM MyTable
JOIN MinDates_CTE 
    ON MinDates_CTE.itemID = MyTable.itemID
    AND MinDates_CTE.MinDate = MyTable.updatedate

或者您可以使用窗口功能:

SELECT itemID, note, color, updateddate, description
FROM (SELECT t.itemID,
             t.note,
             t.color,
             MIN(t.updateddate) OVER (PARTITION BY t.itemId) as MinDate,
             t.description             
      FROM MyTable t) u
where updatedate = MinDate

答案 1 :(得分:0)

可以使用ROW_NUMBER和PARTITION BY组合来完成,假设您的表名是Test,以下可以是一个select语句,它将为您提供所需的输出

SELECT *
FROM 
(SELECT itemID,
        Note,
        Color,
        UpdatedDate,
        Description,
        RowOrder = ROW_NUMBER() OVER(PARTITION BY itemID
                                     ORDER BY updateddate ASC)
 FROM dbo.Test
) AS TempTab
WHERE RowOrder = 1;