假設下表,
TIMESTAMP value
2021-01-27 00:34:05.256000000 1000
2021-01-27 00:34:15.918000000 800
2021-01-27 00:34:46.427000000 1000
2021-01-27 00:25:07.802000000 6300
2021-01-27 00:25:14.651000000 6300
2021-01-27 00:25:31.048000000 150
2021-01-27 00:25:23.264000000 150
2021-01-27 00:26:01.016000000 240
2021-01-27 00:25:38.978000000 450
我試圖實作的最終輸出是,
Change
6
其中 Change 是一個計數器,它在任意兩個連續行(值行)之間的差異不為 0 時遞增。我如何使用 mysql 來實作這一點?
uj5u.com熱心網友回復:
LAG() 可用于獲取前一行:
mysql> select value, lag(value) over(order by timestamp) as prev_value from mytable;
------- ------------
| value | prev_value |
------- ------------
| 6300 | NULL |
| 6300 | 6300 |
| 150 | 6300 |
| 150 | 150 |
| 450 | 150 |
| 240 | 450 |
| 1000 | 240 |
| 800 | 1000 |
| 1000 | 800 |
------- ------------
9 rows in set (0.00 sec)
mysql> select sum(value-prev_value <> 0) as `change` from (
select value, lag(value) over(order by timestamp) as prev_value from mytable
) as t;
--------
| change |
--------
| 6 |
--------
1 row in set (0.01 sec)
LEAD() 可以給出相同的結果,如另一個答案所示。在這兩種情況下,要么第一行沒有前一個,要么最后一行沒有下一個,因此它們無法與 NULL 進行比較。
uj5u.com熱心網友回復:
如果您使用的是最新版本的 mysql,則可以使用lead如下方式將value一行的 與按value排序的下一行的 進行比較timestamp:
with u as
(select *, lead(value) over(order by timestamp) as nextValue
from table_name)
select sum(case when value <> nextValue then 1 else 0 end)
from u;
小提琴
uj5u.com熱心網友回復:
使用此查詢來實作輸出:
SELECT SUM(chang) AS chang FROM
(SELECT SUM(
CASE
WHEN innerT.price = COALESCE((SELECT price FROM `TableName` WHERE id > innerT.id LIMIT 1) , innerT.price) THEN 0
ELSE 1
END
) AS chang
FROM `TableName` as innerT GROUP BY id ) outerT
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/433443.html
標籤:mysql
上一篇:MySQL用變數更新
下一篇:當有多個要考慮的組時找到最大值
