提取 MySQL 5.7 连续值的差异
P粉216807924
P粉216807924 2024-04-01 15:51:07
0
2
437

姓名 日期 小时 计数
米尔斯 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粉216807924
P粉216807924

全部回复(2)
P粉771233336

尝试以下操作:

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粉569205478

MySQL 5.7中,您可以内联更新变量,以包含更新后的“Count”值。由于当“Name”的值更改时,您需要重置变量,因此您可以使用包含先前“Name”值的另一个变量。然后使用 IF 函数检查:

  • 如果您以前的名字与现在的名字相同
  • 然后计算计数差
  • 否则分配 0

它将与ABS a> 函数,对差值应用绝对值。

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

请在此处查看演示。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板