姓名 | 日期 | 小时 | 计数 |
---|---|---|---|
米尔斯 | 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 |
请提出我所缺少的内容。
P粉7712333362024-04-02 13:49:18
尝试以下操作:
SET @count=(select Count_ from Hourly order by Name,Date_,Hours LIMIT 1); Set @Name=(select Name from Hourly order by Name,Date_,Hours LIMIT 1); select Name,Date_,Hours,Count_, ABS(curr_count-lag_count) as DiffCount From ( select Name,Date_,Hours,Count_, Case When @Name = Name Then @count Else Count_ End as lag_count , @count:=Count_ curr_count, @Name:=Name From Hourly order by Name,Date_,Hours ) D Order By Name,Date_,Hours;
查看来自 db-fiddle 的演示。
P粉5692054782024-04-02 11:29:09
在MySQL 5.7中,您可以内联更新变量,以包含更新后的“Count”值。由于当“Name”的值更改时,您需要重置变量,因此您可以使用包含先前“Name”值的另一个变量。然后使用 IF
函数检查:
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
顺利获得输出。它将与:
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
请在此处查看演示。