减去行以显示MySql中的差异

时间:2018-11-04 17:05:12

标签: mysql

我创建了一个表格,用于记录每日的小时表读数。我需要将一天的总读数减去另一天才能显示每天的运行时间。

下面是一个数据库小提琴,它在一行中起作用:db fiddle

我的表格如下所示:

        INSERT INTO `cuidadrun` (`cuidad_id`, `date`, `bc100a`, `bc100b`, `bc100c`, `bc100d`, `bc100e`) VALUES
    (1, '2018-10-18', 500, 500, 500, 500, 500),
    (2, '2018-10-19', 518, 520, 520, 520, 520),
    (3, '2018-10-20', 539, 540, 540, 540, 540),
    (4, '2018-10-21', 558, 560, 560, 560, 560);
    COMMIT;

---

**Query #1**

    SELECT date,
    COALESCE(m1.bc100a - (SELECT m2.bc100a FROM cuidadrun m2 WHERE m2.cuidad_id = m1.cuidad_id - 1), 0) AS diffBC100a 
    FROM cuidadrun m1;

结果:

| date       | diffBC100a |
| ---------- | ---------- |
| 2018-10-18 | 0          |
| 2018-10-19 | 18         |
| 2018-10-20 | 21         |
| 2018-10-21 | 19         |

我的目标是在下表中显示每米的每日小时数。

| date       | diffBC100a | diffBC100b | diffBC100c | diffBC100d | diffBC100e |
| ---------- | ---------- | ---------- | ---------- | ---------- | ---------- |
| 2018-10-18 | 0          | 0          | 0          | 0          | 0          |
| 2018-10-19 | 18         | 20         | 20         | 20         | 20         |
| 2018-10-20 | 21         | 20         | 20         | 20         | 20         |
| 2018-10-21 | 19         | 20         | 20         | 20         | 20         |

我不知道如何实现这一目标。

1 个答案:

答案 0 :(得分:0)

我将对前一个id值行进行“自左联接”,而不是子查询。

SELECT m1.date,
       COALESCE(m1.bc100a - m2.bc100a, 0) AS diffBC100a, 
       COALESCE(m1.bc100b - m2.bc100b, 0) AS diffBC100b, 
       COALESCE(m1.bc100c - m2.bc100c, 0) AS diffBC100c, 
       COALESCE(m1.bc100d - m2.bc100d, 0) AS diffBC100d, 
       COALESCE(m1.bc100e - m2.bc100e, 0) AS diffBC100e
FROM cuidadrun AS m1 
LEFT JOIN cuidadrun AS m2
  ON m2.cuidad_id = m1.cuidad_id - 1 
ORDER BY m1.date

结果

| date       | diffBC100a | diffBC100b | diffBC100c | diffBC100d | diffBC100e |
| ---------- | ---------- | ---------- | ---------- | ---------- | ---------- |
| 2018-10-18 | 0          | 0          | 0          | 0          | 0          |
| 2018-10-19 | 18         | 20         | 20         | 20         | 20         |
| 2018-10-20 | 21         | 20         | 20         | 20         | 20         |
| 2018-10-21 | 19         | 20         | 20         | 20         | 20         |

View on DB Fiddle