![](/img/trans.png)
[英]how to extract json keys and values as table with 2 columns 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;
在MySQL 5.7中,您可以更新內聯變量以包含更新后的“ Count ”值。 由於當“ Name ”的值發生變化時,您需要重新設置變量,您可以使用另一個包含先前“ Name ”值的變量。 然后使用IF
函數檢查:
它將與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
之類的窗口函數來平滑輸出。 它將與:
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.