选择最新的每项

问题描述:

可能重复:
Retrieving the last record in each group选择最新的每项

我有2个表产品和成本

产品

ProdCode - PK 
ProdName 

成本

Effectivedate - PK 
RetailCOst 
Prodcode 

我想这个查询:

SELECT a.ProdCOde AS id, MAX(EffectiveDate) AS edate, RetailCOst AS retail 
FROM cost a 
INNER JOIN product b USING (ProdCode) 
WHERE EffectiveDate <= '2009-10-01' 
GROUP BY a.ProdCode; 

嗯呀它显示了正确的EFFECTIVEDATE但对具体EFFECTIVEDATE犯规匹配的成本。

所以我想选择与每个项目相匹配的成本的最新日期。

例如我选择的日期是“2009-12-25”和1项记录是这些:

ProdCode |EffectiveDate| Cost 
00010000 | 2009-01-05 | 50 
00010000 | 2009-05-25 | 48 
00010000 | 2010-07-01 | 40 

所以结果我应该得到00010000|2009-05-25|48,因为它比上的日期我较轻查询,它是该项目的最新版本。然后我想在我的查询上显示每种产品的最新成本。

希望能尽快收到您的来信!谢谢!

这里需要使用子查询:

SELECT maxdates.ProdCode, maxdates.maxDate, cost.RetailCost as retail 
    SELECT ProdCode, max(EffectiveDate) as maxDate 
    FROM cost 
    WHERE EffectiveDate < '2009-10-01' 
    GROUP BY ProdCode 
) maxdates 
LEFT JOIN cost ON (maxdates.ProdCode=cost.ProdCode 
       AND maxdates.maxDate=cost.EffectiveDate) 

说明:SELECT给所有产品及其各自的最大EffectiveDates的列表。加入会将每个数据录入的零售成本“粘”到结果上。

+0

thanks!我已经在我的查询中使用它了! – QWERTY 2010-02-05 23:25:34

或者,使用旧的最大连接技巧应该做的伎俩。

SELECT 
    p.ProdCode, 
    SUBSTRING(MAX(CONCAT(d.EffectiveDate, c.RetailCost)), 1, 10) AS date, 
    SUBSTRING(MAX(CONCAT(d.EffectiveDate, c.RetailCost)), 10, 100) + 0 AS cost 
FROM 
    product p, 
    cost  c 
WHERE 
    p.ProdCode = c.ProdCode AND 
    c.EffectiveDate < '2009-10-01' 
GROUP BY 
    p.ProdCode