Sql server 从包含其他行的表返回最早的ID
鉴于这些数据:Sql server 从包含其他行的表返回最早的ID,sql-server,duplicates,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-1
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,我只希望通过其更新日期返回最早的Id?在MySQL中,我知道这很容易做到,但在MSSQL中我无法理解。您可以通过自连接和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
这可以通过行号和分区组合来完成,假设您的表名是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;
我无法使窗口功能正常工作,但第一个功能对我所做的工作非常有效,谢谢DavidG!我想我需要了解如何使用分区,而不是真正使用分区。非常感谢你的回答,但是我不能投赞成票!谢谢,我需要更多地使用分区,而不是真正地使用分区,也不知道如何以及何时使用分区。我去读一读;)