搜索

首页  >  问答  >  正文

提取 MySQL 5.7 连续值的差异

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

全部回复(2)我来回复

  • P粉771233336

    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 的演示。

    回复
    0
  • P粉569205478

    P粉5692054782024-04-02 11:29:09

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

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

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

    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

    请在此处查看演示。

    回复
    0
  • 取消回复