首页 > 解决方案 > MySQL - 从前一行中减去值,按 2 个字段分组

问题描述

我有以下数据集:

在此处输入图像描述

我想从同一天同一列的前一行中减去“流”列值。
如果同一天有更多条目,则从同一天的最后一个条目中减去第一个条目。
这是我需要的结果:

在此处输入图像描述

有一个自动增量 id

标签: mysql

解决方案


可以这样做:

SELECT
    t.myMax,
    t.`insertat`,
    IF(t.myMin = t.myMax, t1.myval, t2.`myval` - t1.`myval`) AS newval
FROM (
    SELECT insertat, min(id) AS myMin, max(id) AS myMax
    FROM myTable
    GROUP BY insertat) AS t
LEFT JOIN myTable  t1 ON t1.id = t.myMin
LEFT JOIN myTable  t2 ON t2.id = t.myMax;

样本

MariaDB [bernd]> SELECT * FROM myTable;
+----+------------+-------+
| id | insertat   | myval |
+----+------------+-------+
|  1 | 2021-01-01 |    44 |
|  2 | 2021-01-02 |    99 |
|  3 | 2021-01-02 |   134 |
|  4 | 2021-01-03 |    45 |
|  5 | 2021-01-04 |     2 |
|  6 | 2021-01-04 |    17 |
+----+------------+-------+
6 rows in set (0.01 sec)

MariaDB [bernd]> 
MariaDB [bernd]> SELECT
    -> t.myMax,
    -> t.`insertat`,
    -> IF(t.myMin = t.myMax, t1.myval, t2.`myval` - t1.`myval`) AS newval
    -> FROM (
    -> SELECT insertat, min(id) AS myMin, max(id) AS myMax
    -> FROM myTable
    -> GROUP BY insertat) AS t
    -> LEFT JOIN myTable  t1 ON t1.id = t.myMin
    -> LEFT JOIN myTable  t2 ON t2.id = t.myMax;
+-------+------------+--------+
| myMax | insertat   | newval |
+-------+------------+--------+
|     1 | 2021-01-01 |     44 |
|     3 | 2021-01-02 |     35 |
|     4 | 2021-01-03 |     45 |
|     6 | 2021-01-04 |     15 |
+-------+------------+--------+
4 rows in set (0.03 sec)

MariaDB [bernd]> 

推荐阅读