我有一個系統,僅在資料更改時才存盤資料。因此,資料集如下所示。
| data_type_id | 資料值 | 插入的_at |
|---|---|---|
| 2 | 240 | 2022-01-19 17:20:52 |
| 1 | 30 | 2022-01-19 17:20:47 |
| 2 | 239 | 2022-01-19 17:20:42 |
| 1 | 29 | 2022-01-19 17:20:42 |
我的資料頻率是每 5 秒一次。所以,無論timestamp我是否需要通過假設這個第 5 秒的資料值與前一個值相同來獲得結果。
由于我正在存盤僅更改的資料,因此資料集確實應該如下所示。
| data_type_id | 資料值 | 插入的_at |
|---|---|---|
| 2 | 240 | 2022-01-19 17:20:52 |
| 1 | 30 | 2022-01-19 17:20:52 |
| 2 | 239 | 2022-01-19 17:20:47 |
| 1 | 30 | 2022-01-19 17:20:47 |
| 2 | 239 | 2022-01-19 17:20:42 |
| 1 | 29 | 2022-01-19 17:20:42 |
我不想insert into我的表,我只想在SELECT陳述句上檢索這樣的資料。
有什么方法可以創建這個查詢嗎?
PS。我有很多data_types 因此當 OP 進行查詢時,它通常會獲得大約一百萬行。
編輯:有關服務器的資訊Server version: 10.3.27-MariaDB-0 deb10u1 Debian 10
用戶將確定SELECT DateTime。所以,沒有確定的between時間。
正如@Akina 提到的,有時inserted_at. 差異可能是 ~4 秒或 ~6 秒,而不是特定的 5 秒。由于它不會如此頻繁地發生,因此可以忽略這個事實來生成。
uj5u.com熱心網友回復:
借助為您提供所需的所有組合data_type_id和 5 秒時刻的查詢,您可以使用最接近的子查詢來獲得所需的結果data_value:
with recursive u as
(select '2022-01-19 17:20:42' as d
union all
select DATE_ADD(d, interval 5 second) from u
where d < '2022-01-19 17:20:52'),
v as
(select * from u cross join (select distinct data_type_id from table_name) t)
select v.data_type_id,
(select data_value from table_name where inserted_at <= d and data_type_id = v.data_type_id
order by inserted_at desc limit 1) as data_value,
d as inserted_at
from v
小提琴
您可以將遞回 CTE 替換為任何可以獲得所需 5 秒時刻的查詢。
uj5u.com熱心網友回復:
WITH RECURSIVE
cte1 AS ( SELECT @start_datetime dt
UNION ALL
SELECT dt INTERVAL 5 SECOND FROM cte1 WHERE dt < @end_datetime),
cte2 AS ( SELECT *,
ROW_NUMBER() OVER (PARTITION BY test.data_type_id, cte1.dt
ORDER BY test.inserted_at DESC) rn
FROM cte1
LEFT JOIN test ON FIND_IN_SET(test.data_type_id, @data_type_ids)
AND cte1.dt >= test.inserted_at )
SELECT *
FROM cte2
WHERE rn = 1
https://dbfiddle.uk/?rdbms=mariadb_10.3&fiddle=380ad334de0c980a0ddf1b49bb6fa38e
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/417212.html
標籤:
上一篇:如何通過查詢查詢組中總數的百分比
