【问题标题】:How to get greatest n per group and then update another table如何获得每组最大的 n 然后更新另一个表
【发布时间】:2015-04-16 09:00:10
【问题描述】:

我正在尝试获取表中每篇文章的最新价格,然后我想将此价格放入另一个表中,其中文章 ID 等于该价格的文章 ID。我认为通过执行以下 SQL 语句,我已经正确地获得了“每组获得最大 n”部分:

SELECT item_number, price_date, price
FROM orderline AS t1
INNER JOIN(
    SELECT item_number, MAX(pricedate) AS price_date
    FROM orderline
    GROUP BY item_number) AS t2 
ON t1.item_number = t2.item_number AND t1.price_date = t2.price_date

这给了我一个包含 item_number(也就是商品 ID)、价格日期和价格的表格。

但现在我只想获取每件商品的价格,并将其放入另一个表中,例如“itemprices”。包含列“item_id”和“价格”。

但问题是我无法使用更新语句访问结果集中的两行。我想使用WITH 语句,它允许我访问结果集中的两列。我只会调用“WITH 表”,例如“latestPrice”,然后就做

UPDATE itemprices
SET itemprices.price = latestPrice.price
WHERE itemprices.item_id = latestPrice.item_number

但遗憾的是,WITH 语句不能与SELECT 以外的任何其他内容一起使用。所以我需要改变我的方法。有什么想法吗?

提前致谢!

编辑:我正在使用 DB2,版本:v5r4m0。该平台显然有很多名称,例如 AS/400、iSeries、i5 或 IBM i。

【问题讨论】:

  • 哪个 dbms? (解决方案可能因产品而异......)
  • 查看我的编辑。那是你想要的吗?
  • 很遗憾,哪个版本的 DB2(和平台)?它们之间有很大的差异。即使在支持 CTE 作为UPDATE 一部分的数据库中,它仍然充当常规表引用(如SELECT),因此您仍然必须加入它 - 您的示例解决方案不是有效的语法。哦,与常规子查询相比,CTE 的唯一好处是您可以多次加入它。使用ROW_NUMBER() 获得“顶”行(单次通过表格),您可能也有更好的运气。
  • 版本:v5r4m0。平台,显然有很多名称:AS/400、iSeries、i5 或 IBM i。
  • 这是一个无法解决的问题(或者只是一个难以破解的难题)??在过去的几天里,我做了很多不同的 SQL 练习,希望它能帮助我理解如何处理这个问题。但我还没有到任何地方。

标签: sql sql-update db2 inner-join greatest-n-per-group


【解决方案1】:
SELECT t1.* 
FROM ORDERLINE T1 
LEFT OUTER JOIN ORDERLINE T2 
ON (T1.item_number = T2.item_number AND T1.price_date > T2.price_date) 
WHERE T2.item_number IS NULL

【讨论】:

  • 请添加说明如何解决用户问题。另外,请阅读How to Answer
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-16
  • 2017-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-28
相关资源
最近更新 更多