MySQL:产品当前最低价/上一次最低价差价百分比
我有两个表,一个存储当前最低价格v_prod_prices和td_prod_prices,其中包含所有产品的所有价格更新,下面的函数用于获取当前最低价格和以前最低价格之间的百分比差异。我就快到了,只是有一点逻辑我搞不懂 电流输出 当前函数返回-71.42,这是不正确的,因为它使用的当前价格为10.00,这是正确的,而以前的价格为34.99,这是不正确的 预期/期望输出 通过使用当前价格10.00和以前的最低价格20.00,它应该返回-50 当获得之前的最低价格时,这些记录将从td_产品价格中忽略:MySQL:产品当前最低价/上一次最低价差价百分比,mysql,Mysql,我有两个表,一个存储当前最低价格v_prod_prices和td_prod_prices,其中包含所有产品的所有价格更新,下面的函数用于获取当前最低价格和以前最低价格之间的百分比差异。我就快到了,只是有一点逻辑我搞不懂 电流输出 当前函数返回-71.42,这是不正确的,因为它使用的当前价格为10.00,这是正确的,而以前的价格为34.99,这是不正确的 预期/期望输出 通过使用当前价格10.00和以前的最低价格20.00,它应该返回-50 当获得之前的最低价格时,这些记录将从td_产品价格中忽略
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_产品价格
视图v_prod_prices仅包含基于td_prod_prices表的每家商店每种产品的当前最低价格
运输署产品价格
td_产品价格包含所有产品价格更新
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
让它最终工作,张贴在这里,以供今后任何人在类似的情况下参考。我更改了它,以获取当前最低价格记录的id,并在计算产品以前的最低价格时排除大于或等于该id的任何记录
CREATE FUNCTION FN_GET_PROD_PRICE_CHANGE_DIFF (`prodId` BIGINT)
RETURNS DECIMAL(5,2)
BEGIN
DECLARE `priceDiff` DECIMAL(5,2) DEFAULT 0;
DECLARE `currentPriceId` BIGINT(11) DEFAULT 0;
DECLARE `currentPrice`, `previousPrice` DOUBLE(7,2) DEFAULT 0;
/* Get current price */
SELECT `price_id`
, `price`
INTO `currentPriceId`
, `currentPrice`
FROM `v_prod_prices`
WHERE `prod_id` = `prodId`
ORDER BY `price` ASC
LIMIT 0,1;
/* Get previous price */
SELECT `spr`.`spr_price` AS `price`
INTO `previousPrice`
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 `spr`.`spr_added` > `currentAdded`
AND `spr2`.`spr_id` < `currentPriceId`
)
AND `prod`.`prod_status` = 1
AND `prod`.`prod_id` = prodId
AND `spr`.`spr_id` < `currentPriceId`
ORDER BY price ASC
LIMIT 0,1;
IF `currentPrice` <> 0 AND `previousPrice` <> 0 AND `currentPrice` <> `previousPrice` THEN
SET `priceDiff` = ((`currentPrice` - `previousPrice`) / `previousPrice`) * 100;
END IF;
RETURN `priceDiff`;
END//
给定样本数据集,期望结果应该是什么?@草莓,期望结果在预期/期望输出下的问题中。我不明白v_产品价格和td_产品价格之间的区别,也不知道你如何定义20是正确的先前价格选择取决于哪个标准?@cFreed,我已经澄清了问题中的细节。查看v_prod_prices仅包含每个商店每个产品的当前最低价格,所有数据来自td_prod_prices表,td_prod_prices表包含产品的所有价格更新,希望更清楚。20是基于添加的时间戳的先前最低价格,因为它是10成为最低价格之前的最低价格。
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//
CREATE FUNCTION FN_GET_PROD_PRICE_CHANGE_DIFF (`prodId` BIGINT)
RETURNS DECIMAL(5,2)
BEGIN
DECLARE `priceDiff` DECIMAL(5,2) DEFAULT 0;
DECLARE `currentPriceId` BIGINT(11) DEFAULT 0;
DECLARE `currentPrice`, `previousPrice` DOUBLE(7,2) DEFAULT 0;
/* Get current price */
SELECT `price_id`
, `price`
INTO `currentPriceId`
, `currentPrice`
FROM `v_prod_prices`
WHERE `prod_id` = `prodId`
ORDER BY `price` ASC
LIMIT 0,1;
/* Get previous price */
SELECT `spr`.`spr_price` AS `price`
INTO `previousPrice`
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 `spr`.`spr_added` > `currentAdded`
AND `spr2`.`spr_id` < `currentPriceId`
)
AND `prod`.`prod_status` = 1
AND `prod`.`prod_id` = prodId
AND `spr`.`spr_id` < `currentPriceId`
ORDER BY price ASC
LIMIT 0,1;
IF `currentPrice` <> 0 AND `previousPrice` <> 0 AND `currentPrice` <> `previousPrice` THEN
SET `priceDiff` = ((`currentPrice` - `previousPrice`) / `previousPrice`) * 100;
END IF;
RETURN `priceDiff`;
END//