SQL Group By Question

时间:2011-05-13 09:49:57

标签: sql sql-server

我有一张跟踪产品视图的表格。

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,因为这是基于行的?

帮助表示赞赏。

3 个答案:

答案 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;