SQL 嵌套连接显示每个产品的当前价格并使用 MAX()
Posted
技术标签:
【中文标题】SQL 嵌套连接显示每个产品的当前价格并使用 MAX()【英文标题】:SQL Nested join showing the current price of each product and using MAX() 【发布时间】:2021-02-02 04:50:08 【问题描述】:目前每种产品的价格是多少?显示产品代码、产品描述、单位及其当前价格。 提示:您将使用 MAX()。这是一个嵌套连接。
产品表
产品代码
说明
单位
价格历史记录
有效日期
产品代码
单价
有人可以帮我改进我的脚本吗?
这是我的脚本,我正在使用 ibm.cloud
SELECT p.prodCode, p.description, p.unit, MAX(ph.unitPrice) "Current Price"
FROM product p
FULL JOIN priceHist ph
ON p.prodCode = ph.prodCode
GROUP BY p.prodCode, p.description, p.unit
ORDER BY MAX (ph.unitPrice);
【问题讨论】:
您将当前价格定义为 priceHistory 表中产品的最高单价?如果价格下跌,这种假设似乎会被打破。我认为当前价格将基于价格发布到 priceHistory 的日期。 我的 priceHist 有 effDate(生效日期。) 我已完成编辑,您能帮我改进一下答案吗? 您可以使用priceHist
两次得到unitPrice
最大effDate
对于每个prodCode
:首先您按prodCode
分组并使用max(effDate) as effDate
,然后将结果加入这两列相同的priceHist
。尝试自己编写这样的连接。之后很容易写一个最后的声明加入product
。
【参考方案1】:
这将在表格中为您提供每种产品及其最新价格。
SELECT p.prodCode, p.description, p.unit,
(SELECT unitPrice
FROM priceHist
WHERE prodCode = p.prodCode
ORDER BY effDate DESC
LIMIT 1
) "Current Price"
FROM product p;
【讨论】:
如果没有 WHERE 脚本怎么办?我们将使用 2 priceHist ?【参考方案2】:我认为不需要完全加入(使用left join
),您可以使用where
子句,如下所示:
SELECT p.prodCode, p.description, p.unit, coalesce(ph.unitPrice,p.unitprice) "Current Price"
FROM product p
Left JOIN priceHist ph ON p.prodCode = ph.prodCode
WHERE ph.prodcode is null
or ph.date_col = (select max(phh.date_col) from pricehist phh on phh.prodcode = ph.prodcode)
【讨论】:
如果没有 WHERE 脚本怎么办?我们将使用 2 priceHist ?【参考方案3】:在 DB2 中,我会推荐窗口函数:
SELECT p.prodCode, p.description, p.unit, ph.unitPrice as current_price
FROM product p LEFT JOIN
(SELECT ph.*,
ROW_NUMBER() OVER (PARTITION BY prodCode ORDER BY effdate) as seqnum
FROM priceHist ph
) ph
ON ph.prodCode = p.prodCode AND ph.seqnum = 1
ORDER BY ph.unitPrice;
【讨论】:
如果没有 WHERE 脚本怎么办?我们将使用 2 priceHist ? @HiImnewb 。 . .我不知道你在评论中的意思。过滤位于on
子句中。以上是关于SQL 嵌套连接显示每个产品的当前价格并使用 MAX()的主要内容,如果未能解决你的问题,请参考以下文章