我有一张跟踪产品视图的表格。
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
据我所知,我不能使用distinct,因为这是基于行的?
帮助表示赞赏。
答案 0 :(得分:6)
为每个ProductID生成一个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不起作用。
这是基于我对问题的评论
“没有在两个相邻行中生产。相邻由下一个/上一个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
答案 1 :(得分:0)
如果日期不重要,您可以在TrackID和ProductID上进行GroupBy并执行Min of the CreatedOn。
SELECT TrackID ,ProductID ,MIN(CreatedOn)
FROM [table]
GROUP BY TrackID ,ProductID
如果日期相同,您可以按所有三个分组
SELECT TrackID ,ProductID ,CreatedOn
FROM [table]
GROUP BY TrackID ,ProductID ,CreatedOn
答案 2 :(得分:0)
select min(TrackId), ProductId, CreatedOn
from YourTable
group by ProductId, CreatedOn;