| 姓名 | 日期 | 小时 | 计数 |
|---|---|---|---|
| 米尔斯 | 2022-07-17 | 23 | 12 |
| 米尔斯 | 2022-07-18 | 00 | 15 |
| 米尔斯 | 2022-07-18 | 01 | 20 |
| 米尔斯 | 2022-07-18 | 02 | 22 |
| 米尔斯 | 2022-07-18 | 03 | 25 |
| 米尔斯 | 2022-07-18 | 04 | 20 |
| 米尔斯 | 2022-07-18 | 05 | 22 |
| 米尔斯 | 2022-07-18 | 06 | 25 |
| 迈克 | 2022-07-18 | 00 | 15 |
| 迈克 | 2022-07-18 | 01 | 20 |
| 迈克 | 2022-07-18 | 02 | 22 |
| 迈克 | 2022-07-18 | 03 | 25 |
| 迈克 | 2022-07-18 | 04 | 20 |
我当前的输入表存储每天每小时连续记录的计数信息。我需要提取连续计数值的差异,但由于我被迫使用 MySQL 5.7,所以我很难做到这一点。
我编写的查询如下:
SET @cnt := 0; SELECT Name, Date, Hours, Count, (@cnt := @cnt - Count) AS DiffCount FROM Hourly ORDER BY Date;
这没有给出准确的结果。
我希望得到以下输出:
| 姓名 | 日期 | 小时 | 计数 | 差异 |
|---|---|---|---|---|
| 米尔斯 | 2022-07-17 | 23 | 12 | 0 |
| 米尔斯 | 2022-07-18 | 00 | 15 | 3 |
| 米尔斯 | 2022-07-18 | 01 | 20 | 5 |
| 米尔斯 | 2022-07-18 | 02 | 22 | 2 |
| 米尔斯 | 2022-07-18 | 03 | 25 | 3 |
| 米尔斯 | 2022-07-18 | 04 | 20 | 5 |
| 米尔斯 | 2022-07-18 | 05 | 22 | 2 |
| 米尔斯 | 2022-07-18 | 06 | 25 | 3 |
| 迈克 | 2022-07-18 | 00 | 15 | 0 |
| 迈克 | 2022-07-18 | 01 | 20 | 5 |
| 迈克 | 2022-07-18 | 02 | 22 | 2 |
| 迈克 | 2022-07-18 | 03 | 25 | 3 |
| 迈克 | 2022-07-18 | 04 | 20 | 5 |
| 迈克 | 2022-07-18 | 05 | 22 | 2 |
| 迈克 | 2022-07-18 | 06 | 25 | 3 |
请提出我所缺少的内容。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
尝试以下操作:
查看来自 db-fiddle 的演示。
在MySQL 5.7中,您可以内联更新变量,以包含更新后的“Count”值。由于当“Name”的值更改时,您需要重置变量,因此您可以使用包含先前“Name”值的另一个变量。然后使用
IF函数检查:它将与
ABSa> 函数,对差值应用绝对值。SET @cnt := NULL; SET @name := NULL; SELECT Date, Hours, ABS(IF(@name = Name, @cnt := @cnt - Count, 0) ) AS DiffCount, (@name := Name) AS Name, (@cnt := Count) AS Count FROM tab ORDER BY Name DESC, Date, Hours;请在此处查看演示。
在MySQL 8.0中,您可以使用像
LAG顺利获得输出。它将与:ABS应用绝对值差异值,COALESCE用于删除第一个空值。SELECT *, COALESCE(ABS( Count - LAG(Count) OVER( PARTITION BY Name ORDER BY Date, Hours ) ), 0) AS Diff FROM tab ORDER BY Name DESC, Date, Hours请在此处查看演示。