【发布时间】:2016-05-09 05:23:45
【问题描述】:
我有两张表,一张存储当前最低价格v_prod_prices 和td_prod_prices,其中包含所有产品的所有价格更新,下面的函数旨在获取当前最低价格与之前最低价格之间的百分比差异最低价格。我几乎有一点我无法弄清楚的逻辑。
电流输出
当前函数返回-71.42,这是不正确的,因为它使用的是正确的10.00的当前价格和不正确的34.99的先前价格。
预期/期望的输出
它应该返回-50,使用当前价格10.00和之前的最低价格20.00。
当获取之前的最低价格时,这些记录将从td_prod_prices 中被忽略:
id prod_id price store added
-----------------------------------------------
734 426 10.00 1 2016-01-22 02:05:17
819 426 42.99 3 2016-01-24 23:47:51
1052 426 34.99 4 2016-01-27 00:54:50
v_prod_prices
v_prod_prices 视图仅包含基于td_prod_prices 表的每个商店每件产品的当前最低价格。
prod_id price store added
-------------------------------------------
426 34.99 4 2016-01-27 00:54:50
426 42.99 3 2016-01-24 23:47:51
426 10.00 1 2016-01-22 02:05:17
426 29.19 2 2016-01-15 14:09:53
td_prod_prices
td_prod_prices 包含所有产品价格更新。
id prod_id price store added
-----------------------------------------------
500 426 29.19 2 2016-01-15 14:09:53
660 426 20.00 1 2016-01-15 21:07:38
734 426 10.00 1 2016-01-22 02:05:17
819 426 42.99 3 2016-01-24 23:47:51
1052 426 34.99 4 2016-01-27 00:54:50
SQL
CREATE FUNCTION FN_GET_PROD_PRICE_CHANGE_DIFF (`prodId` BIGINT)
RETURNS DECIMAL(5,2)
BEGIN
DECLARE `priceDiff` DECIMAL(5,2) DEFAULT 0;
DECLARE `currentPrice`, `previousPrice` DOUBLE(7,2) DEFAULT 0;
DECLARE `currentStore`, `previousStore` INT DEFAULT 0;
DECLARE `currentAdded`, `previousAdded` TIMESTAMP;
/* Get current price */
SELECT MIN(`price`)
, `store`
, `added`
INTO `currentPrice`
, `currentStore`
, `currentAdded`
FROM `v_prod_prices`
WHERE `prod_id` = `prodId`
LIMIT 0,1;
/* Get previous price */
SELECT MIN(`spr`.`spr_price`) AS `price`
, `spr`.`spr_str_id` AS `store`
, `spr`.`spr_added` AS `added`
INTO `previousPrice`
, `previousStore`
, `previousAdded`
FROM `td_prod` `prod`
JOIN `td_prod_prices` `spr` ON `prod`.`prod_id` = `spr`.`spr_prod_id`
WHERE NOT EXISTS (
SELECT 1
FROM `td_prod_prices` `spr2`
WHERE `spr`.`spr_prod_id` = `spr2`.`spr_prod_id`
AND `spr`.`spr_str_id` = `spr2`.`spr_str_id`
AND `spr`.`spr_added` < `spr2`.`spr_added`
)
AND `prod`.`prod_status` = 1
AND `prod`.`prod_id` = prodId;
IF `currentPrice` <> 0 AND `previousPrice` <> 0 AND `currentPrice` <> `previousPrice` THEN
SET `priceDiff` = ((`currentPrice` - `previousPrice`) / `previousPrice`) * 100;
END IF;
RETURN `priceDiff`;
END//
【问题讨论】:
-
给定样本数据集,期望的结果应该是什么?
-
@Strawberry,想要的结果在
Expected/Desired Output下的问题中。 -
我不明白
v_prod_prices和td_prod_prices之间的区别是什么,也不明白你如何定义20 是正确的先前价格(选择取决于哪个标准?)。 -
@cFreed,我已经澄清了问题中的细节。
v_prod_prices视图仅包含每个商店每个产品的当前最低价格,所有数据来自td_prod_prices表,td_prod_prices表包含产品的所有价格更新,希望更清楚。 20 是基于added时间戳的先前最低价格,因为它是 10 成为最低价格之前的最低价格。
标签: mysql