Heim > Fragen und Antworten > Hauptteil
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粉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
请在此处查看演示。