【问题标题】:MySQL: Product Current Lowest Price/Previous Lowest Price Percent DifferenceMySQL:产品当前最低价格/以前最低价格百分比差异
【发布时间】:2016-05-09 05:23:45
【问题描述】:

我有两张表,一张存储当前最低价格v_prod_pricestd_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_pricestd_prod_prices 之间的区别是什么,也不明白你如何定义20 是正确的先前价格(选择取决于哪个标准?)。
  • @cFreed,我已经澄清了问题中的细节。 v_prod_prices 视图仅包含每个商店每个产品的当前最低价格,所有数据来自td_prod_prices 表,td_prod_prices 表包含产品的所有价格更新,希望更清楚。 20 是基于 added 时间戳的先前最低价格,因为它是 10 成为最低价格之前的最低价格。

标签: mysql


【解决方案1】:

最终得到了它的工作,在此处发布以供遇到类似情况的任何人将来参考。我将其更改为获取当前最低价格记录的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//

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-05
    • 2018-04-26
    • 2013-01-14
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    • 2013-02-25
    相关资源
    最近更新 更多