2014-10-19 85 views
1

鑑於這樣的數據:返回從表中最早的ID,包括其他行

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 

我如何可以從中選擇,完全返回所有的行,但那裏有標識的是重複的,我只想要回最早的企業之一通過更新日期?在MySQL中,我明白這很容易做到,但在MSSQL中我無法理解它。

回答

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 
+0

我不能讓窗口功能工作,但第一個對我所做的事很好,謝謝DavidG! 我想我需要讓我的頭部使用分區雖然,並沒有真正使用它。非常感謝您的回答,但我不能投票! – h3x0 2014-10-19 11:18:18

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; 
+0

感謝Anoo,我需要更多地使用PARTITION,並沒有真正使用它,並且不知道如何以及何時使用它。生病去做一下閱讀;) – h3x0 2014-10-19 11:20:22