繁体   English   中英

从上一行减去与分组有关的值

[英]Subtract a value from previous row respecting the grouping

我有下表:

CREATE TABLE `movm` (
    `id` INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `product` INTEGER NOT NULL,
    `value` DECIMAL(10, 2) NOT NULL
    -- ...
);

还有一些数据:

INSERT INTO `movm`(`product`, `value`) VALUES 
    (1, 1000),
    (1, -200),
    (1,  100),
    (2,   50),
    (2,  -10),
    (1,  100),
    (2,  -20);

我希望得到以下结果:

+----+---------+---------+----------+---------+
| id | product | value   | previous | current |
+----+---------+---------+----------+---------+
|  1 |       1 | 1000.00 |        0 |    1000 |
|  2 |       1 | -200.00 |     1000 |     800 |
|  3 |       1 |  100.00 |      800 |     900 |
|  6 |       1 |  100.00 |      900 |    1000 |
|  4 |       2 |   50.00 |        0 |      50 |
|  5 |       2 |  -10.00 |       50 |      40 |
|  7 |       2 |  -20.00 |       40 |      20 |

但始终要尊重GROUP BY 产品

我尝试了以下SQL:

SELECT
    `id`,
    `product`,
    `value`,
    @previous := (@current)           AS `previous`,
    @current  := (@current + `value`) AS `current`
    FROM
        `movm`,
        (
            SELECT
                @previous := 0,
                @current  := 0
        ) AS `__movm`;

因为它不尊重分组依据,所以总会汇总所有内容,因此没有决胜局。

已经做过IF(@product != product, @current := 0, NULL) ; 可以,但是没有那么灵活。 而且我还需要绕过任何顺序仅跟踪该产品的值,如您所见,它们没有排序(我认为这很容易解决将SQL封装在子查询中)。

因此:是否有更好的解决方案,可以使用GROUP BY product并获得所示的预期结果?

您需要有另一个变量来跟踪产品,还需要order by以便您可以更改product变量并在产品值更改时重置counters

这将起作用。

SELECT
    id,
    product,
    value,
    @previous := IF( @prevProduct = product,@current,0)           AS previous,
    @current  := IF( @prevProduct = product, @current + value, value) AS current,
    @prevProduct := product as var_val 
    FROM
    movm,
        (
            SELECT
                @previous := 0,
                @current  := 0,
                @prevProduct := NULL
        ) AS `__movm`
    ORDER BY product

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM