SQL存储过程返回每个ID的单个记录,其中包含该ID的最大日期

时间:2014-03-10 18:42:54

标签: sql stored-procedures greatest-n-per-group

我在弄清楚如何从我的数据中获取特定结果时遇到了问题,而我似乎无法编写一个能够解决问题的查询。

这就是我所拥有的。我有一个表[产品],其中包含特定产品的详细信息,我有第二个表[ProdTrans]这两个是产品ID号字段中的一对多关系“PrID”ProdTrans表还有一个日期字段对于每个记录的创建时间和价格。 我遇到的问题是我想构建一个查询,它将获取每个PrID的最新记录并将它们作为列表返回。我尝试使用where子句Where Max(Date),但似乎只返回总体上最近日期的记录,并跳过最近记录不是最近整体日期的一些PrID。

我不确定如何调整我的标准来纠正这个问题。

这是我到目前为止所写的内容。

    Select *
    From ProdTrans
    Where transDate = Max(transDate)
    Order By PrID

我希望它基本上返回表中所有PrID的列表,其中包含PrID的最新事务,在这种情况下,该产品的当前价格是什么。

请帮助我知道我错过了一些简单的东西但是因为我的生活不记得它是什么。

[UPDATE]

好的,让我帮助澄清一下我需要输出的内容,所以下面我将从表中给出一个示例数据集

PrID CreateDate成本保证金
001 1/1/2000 25.00 2.10 005 2/11/2005 15.48 1.50 002 3/5/2005 8.49 0.23 001 2/10/2006 22.95 1.19

等等我需要得到的是一个列表,它只返回每个PrID的一个实例,它必须是具有最新Date / Time值的实例。 还有一些挖掘,我发现在PrID字段上没有外键关系,它们都是手动输入的(再次这是我试图修补的遗留系统,所以我没有设置它也没有设计它。只需要解决奇怪的设计) 此过程用于将此数据集输出到外部应用程序。

2 个答案:

答案 0 :(得分:2)

SELECT P.PRID, COST,MARGIN
FROM ProdTrans AS P
JOIN ( SELECT MAX(TRANSDATE) AS MAXDATE, PRID
FROM ProdTrans
GROUP BY PRID ) AS M
  ON M.PRID = P.PRID 
 AND M.MAXDATE = P.TRANSDATE
ORDER BY P.PRID

答案 1 :(得分:1)

试试这个

select * from ProdTrans 
     where
     (prid,date) IN (Select prid,max(date)
                   From ProdTrans
                   group by prid)    

用于Oracle和MySQL DB