Extrahieren Sie Unterschiede aufeinanderfolgender Werte in MySQL 5.7
P粉216807924
P粉216807924 2024-04-01 15:51:07
0
2
390

Name Datum Stunden Zählen
Mühlen 2022-07-17 23 12
Mühlen 2022-07-18 00 15
Mühlen 2022-07-18 01 20
Mühlen 2022-07-18 02 22
Mühlen 2022-07-18 03 25
Mühlen 2022-07-18 04 20
Mühlen 2022-07-18 05 22
Mühlen 2022-07-18 06 25
Mike 2022-07-18 00 15
Mike 2022-07-18 01 20
Mike 2022-07-18 02 22
Mike 2022-07-18 03 25
Mike 2022-07-18 04 20

Meine aktuelle Eingabetabelle speichert kontinuierlich jede Stunde des Tages aufgezeichnete Zählinformationen. Ich muss die Differenz aufeinanderfolgender Zählwerte extrahieren, aber da ich gezwungen bin, MySQL 5.7 zu verwenden, habe ich Probleme damit.

Die Anfrage, die ich geschrieben habe, lautet wie folgt:

SET @cnt := 0;
SELECT Name, Date, Hours, Count, (@cnt := @cnt - Count) AS DiffCount
FROM Hourly
ORDER BY Date;

Dies liefert keine genauen Ergebnisse.

Ich möchte folgende Ausgabe erhalten:

Name Datum Stunden Zählen Unterschied
Mühlen 2022-07-17 23 12 0
Mühlen 2022-07-18 00 15 3
Mühlen 2022-07-18 01 20 5
Mühlen 2022-07-18 02 22 2
Mühlen 2022-07-18 03 25 3
Mühlen 2022-07-18 04 20 5
Mühlen 2022-07-18 05 22 2
Mühlen 2022-07-18 06 25 3
Mike 2022-07-18 00 15 0
Mike 2022-07-18 01 20 5
Mike 2022-07-18 02 22 2
Mike 2022-07-18 03 25 3
Mike 2022-07-18 04 20 5
Mike 2022-07-18 05 22 2
Mike 2022-07-18 06 25 3

Bitte schlagen Sie vor, was mir fehlt.

P粉216807924
P粉216807924

Antworte allen(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

请在此处查看演示。

Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage