2010-02-05 88 views
3

可能重複:
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,因爲它比上的日期我較輕查詢,它是該項目的最新版本。然後我想在我的查詢上顯示每種產品的最新成本。

希望能儘快收到您的來信!謝謝!

回答

2

這裏需要使用子查詢:

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

1

或者,使用舊的最大連接技巧應該做的伎倆。

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