2011-05-13 43 views
0

我有一張跟蹤產品視圖的表格。SQL Group通過問題

TrackId ProductId CreatedOn 
1  1   01/01/2011 
2  4   01/01/2011 
3  4   01/01/2011 
4  10  01/01/2011 

我想要做的是返回一個沒有兩個ProductIds相鄰的數據集。從上面的數據集即我希望回到:

TrackId ProductId CreatedOn 
1  1   01/01/2011 
2  4   01/01/2011 
4  10  01/01/2011 

我所知,因爲這我不能用不同的就是基於行?

幫助讚賞。

+1

你的意思是「沒有製作兩個相鄰的行,相鄰是由next/previous Trackid定義的」? – gbn 2011-05-13 09:53:28

回答

6

您可以將相同的生成每個產品ID一個row number順序,取前

;WITH cte AS 
(
    SELECT 
     *, 
     ROW_NUMBER() OVER (PARTITION BY ProductID ORDER BY TrackID) AS rn 
    FROM 
     MyProductTable 
) 
SELECT 
    TrackId ProductId CreatedOn 
FROM 
    cte 
WHERE 
    rn = 1 

編輯:

如果您想要使用聚合,首先需要單獨的子查詢以確保一致的結果。直MIN不起作用。

這是基於我對這個問題的評論

「沒有相鄰的兩行的productid,毗鄰由下一首/上的TrackID定義」

SELECT 
    M.* 
FROM 
    myProductTable M 
    JOIN 
    (--gets the lowest TrackID for a ProductID 
    SELECT ProductID, MIN(TrackID) AS MinTrackID 
    FROM myProductTable 
    GROUP BY ProductID 
    ) M2 ON M.ProductID= M2.ProductID AND M.TrackID= M2.MinTrackID 
+0

+1 @izip,如果您尚未使用CTE和SQL 2005+的排名功能,那麼請學習它們。他們會很好地爲你服務。 – 2011-05-13 09:57:07

+0

謝謝,會做。 – izip 2011-05-13 10:01:31

0

如果日期不重要,您可以在TrackID和ProductID上GroupBy並對CreatedOn執行Min。

SELECT TrackID ,ProductID ,MIN(CreatedOn) 
FROM [table] 
GROUP BY TrackID ,ProductID 

如果日期是由三個

SELECT TrackID ,ProductID ,CreatedOn 
FROM [table] 
GROUP BY TrackID ,ProductID ,CreatedOn 
+0

我需要返回完整的數據集。 – izip 2011-05-13 09:55:21

+0

兩者都會在表格中顯示*所有行*,因爲TrackID不同... – gbn 2011-05-13 09:55:51

+0

@izip:如果要刪除某些行,則無法返回「完整數據集」 – gbn 2011-05-13 09:56:29

0
select min(TrackId), ProductId, CreatedOn 
from YourTable 
group by ProductId, CreatedOn; 
+1

如果CreatedOn對於給定的ProductId有所不同,該怎麼辦?然後你有錯誤的輸出... – gbn 2011-05-13 09:59:46