鉴于此数据:
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中我无法理解它。
答案 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;