簡體   English   中英

提取 MySQL 5.7 連續值的差異

[英]Extract difference in consecutive values for 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

請提出我所缺少的。

嘗試以下操作:

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

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

此處查看演示。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM