SQL从弱采购明细表中获取产品的最后采购价格
Posted
技术标签:
【中文标题】SQL从弱采购明细表中获取产品的最后采购价格【英文标题】:SQL get last purchase price of a product from weak purchase detail table 【发布时间】:2014-05-11 21:50:07 【问题描述】:我有两个日期变量:@date1 和@date2。 @date1 总是大于 @date2。
我有以下两张表:
+--------+
|purchase|
+--------+
|purch_id|
|date |
+--------+
+-------------+
|purch_details|
+-------------+
|purch_id |
|product_id |
|product_price|
+-------------+
表“purchase”存储购买日期和唯一标识符 (purch_id)。
Purch_details 是一个没有唯一标识符的弱表。它包含购买的详细信息,包括产品 ID (product_id)、我为产品支付的价格 (product_price) 和“购买”表 (purch_id) 的标识符。
使用 SQL 语句,在日期范围 @date1-@date2 中,我想获取我上次购买的每种产品的价格。
换句话说,我想要在日期范围@date-@date2 内我同意购买表格purch_details 中每件产品的最后价格。结果不得包含 product_id 重复项。因此,结果应该是这样的:
+-----------------------------------------+
|product_id | product_price |purchase_date|
|00001 | $10.10 |2014-01-01 |
|00002 | $12.45 |2014-04-30 |
|00003 | $9.20 |2014-04-30 |
+-----------------------------------------+
(我上次在 2014 年 1 月 1 日以 10.10 美元的价格购买了产品 00001。在 2014 年 4 月 30 日,我最后一次以 12.24 美元和 9.20 美元的价格购买了产品 00002 和 00003)
我尝试了以下 SQL:
SELECT
purch_details.purch_id,
purch_details.purch_price,
purchase.date
FROM
purchase
INNER JOIN
purch_details ON purchase.purch_id=purch_details.purch_id
WHERE
purchase.date>=@date1 AND purchase.date<=@date2
GROUP BY
purch_details.purch_id,
purch_details.purch_price,
purchase.date
上述 SQL 的问题在于它返回的行具有重复的 product_id。
【问题讨论】:
您使用的是哪个 DBMS? 【参考方案1】:我认为这应该可行:
;WITH CTE AS
(
SELECT purch_details.purch_id,
purch_details.purch_price,
purchase.date,
ROW_NUMBER() OVER(PARTITION BY purch_details.purch_id
ORDER BY purchase.date DESC) RN
FROM purchase
INNER JOIN purch_details
ON purchase.purch_id=purch_details.purch_id
WHERE purchase.date BETWEEN @date1 AND @date2
)
SELECT purch_id,
purch_price,
[date]
FROM CTE
WHERE RN = 1;
【讨论】:
SQL 无法编译。它说关键字'ON'附近的语法不正确以上是关于SQL从弱采购明细表中获取产品的最后采购价格的主要内容,如果未能解决你的问题,请参考以下文章