Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 从包含其他行的表返回最早的ID_Sql Server_Duplicates - Fatal编程技术网

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!我想我需要了解如何使用分区,而不是真正使用分区。非常感谢你的回答,但是我不能投赞成票!谢谢,我需要更多地使用分区,而不是真正地使用分区,也不知道如何以及何时使用分区。我去读一读;)