MySQL:产品当前最低价/上一次最低价差价百分比

MySQL:产品当前最低价/上一次最低价差价百分比,mysql,Mysql,我有两个表,一个存储当前最低价格v_prod_prices和td_prod_prices,其中包含所有产品的所有价格更新,下面的函数用于获取当前最低价格和以前最低价格之间的百分比差异。我就快到了,只是有一点逻辑我搞不懂 电流输出 当前函数返回-71.42,这是不正确的,因为它使用的当前价格为10.00,这是正确的,而以前的价格为34.99,这是不正确的 预期/期望输出 通过使用当前价格10.00和以前的最低价格20.00,它应该返回-50 当获得之前的最低价格时,这些记录将从td_产品价格中忽略

我有两个表,一个存储当前最低价格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//