【问题标题】:Selecting the latest per group of items [duplicate]选择每组最新的项目[重复]
【发布时间】:2011-01-13 13:02:14
【问题描述】:

可能重复:
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;

嗯,它显示了正确的生效日期,但该特定生效日期的费用不匹配。

所以我想选择与每件商品匹配成本的最新日期。

例如,我选择的日期是“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,因为它小于我查询的日期,并且它是该项目的最新日期。然后我想在我的查询中显示每种产品的最新成本。

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

【问题讨论】:

    标签: sql mysql greatest-n-per-group


    【解决方案1】:

    您需要在这里使用子查询:

    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 列出了所有产品及其各自的最大有效日期。连接将每个数据条目的零售成本“粘合”到结果中。

    【讨论】:

    • 谢谢!我已经在我的查询中使用了它!
    【解决方案2】:

    或者,使用旧的 max concat 技巧应该可以解决问题。

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-24
      • 1970-01-01
      • 1970-01-01
      • 2011-09-11
      • 2013-06-24
      • 2022-01-14
      • 2020-05-23
      相关资源
      最近更新 更多