suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Extrahieren Sie Unterschiede aufeinanderfolgender Werte in MySQL 5.7

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粉216807924P粉216807924232 Tage vor394

Antworte allen(2)Ich werde antworten

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

    Antwort
    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

    请在此处查看演示。

    Antwort
    0
  • StornierenAntwort