2

一个非常新手的mysql问题。我有一个如下所示的 mysql 表,其中输出列是我要生成的

测试表

Record_ID  Day  price_change  Output
=======================================
1          1     null          null
2          1     3             3
3          1    -1             null
4          1     0            -1
5          1     1             1
6          1    -1             null
7          1     0             null
8          1     0            -1
9          1     1             1
10         2     null          null
11         2     1             null

我要做的是在记录的 price_change 列中获取运行总计,并在每次值的符号更改、日期更改或下一个值为空时输出该总计。

record_id 可能并不总是连续的,因此它可能是 10、15、16、19、20 等。

我试图做类似下面的事情(我不处理一天的变化),但它的行为不像我预期的那样,我无法在输出后重置变量。谁能指出我应该如何处理这个问题的正确方向?

set @var := 0;
SELECT 
  rid,
  pcng,
        CASE 
       when pcng > 0 and next_price_change > 0 then @var := @var + pcng /* output null */
        when pcng < 0 and next_price_change < 0 then @var := @var + pcng /* output null */
        when pcng * next_price_change < 0 or next_price_change is null then @var + pcng
        /* how to reset the @var ??? */
      END AS output_sum
FROM (
    SELECT
        Record_ID as rid,
        Price_CHANGE as pcng,
    /* Subselect next number from next Record_ID which may not be in sequence */
    (SELECT Price_change FROM test_table WHERE Record_ID > rid ORDER BY Record_ID ASC LIMIT 1) AS next_price_change
    FROM test_table
) pcalc
4

1 回答 1

3

变量赋值在mysql中从左到右进行评估,所以有类似的东西

mysql> set @foo=1;
Query OK, 0 rows affected (0.00 sec)

会给你这个,动态更新整个字段列表中的变量:

mysql> select @foo as first, @foo:=@foo+1 as second, @foo:=@foo+10 as third;
+-------+--------+-------+
| first | second | third |
+-------+--------+-------+
|     1 |      2 |    12 |
+-------+--------+-------+
1 row in set (0.00 sec)

现在请注意,变量以原始 1 开始,然后更新为新值。然后,如果您重新运行相同的查询:

mysql> select @foo as first, @foo:=@foo+1 as second, @foo:=@foo+10 as third;
+-------+--------+-------+
| first | second | third |
+-------+--------+-------+
|    12 |     13 |    23 |
+-------+--------+-------+
1 row in set (0.00 sec)

您从上一个查询中的LAST分配值开始,然后再次对其进行更新。

因此,基本上,只需执行所有查询中的计算,然后作为 中的LAST字段,SELECT使用新值更新变量。例如

SET @prev = null;
SELECT this + @prev, that - @prev, whatever * @prev, @prev := new_value
于 2013-08-13T17:49:43.990 回答