SELECT *,max(lp_index) FROM lp.tdm_lp_original_data
where ts >= '2023-12-28 18:11:33.521'
and ts <= '2023-12-29 19:03:12.148'
INTERVAL(2s)
FILL(PREV)
在時(shí)間序列數(shù)據(jù)庫(kù)TDengine中,FILL
函數(shù)與GROUP BY
子句結(jié)合使用,提供了對(duì)于在指定間隔內(nèi)可能存在的數(shù)據(jù)空缺的填充策略。FILL(PREV)
和FILL(linear)
是FILL
函數(shù)的不同選項(xiàng),它們填充數(shù)據(jù)缺失值的方式有所區(qū)別:
-
FILL(PREV)
:當(dāng)數(shù)據(jù)序列中存在時(shí)間間隔內(nèi)沒有數(shù)據(jù)的情況時(shí),FILL(PREV)
會(huì)將缺失的數(shù)據(jù)點(diǎn)填充為前一個(gè)時(shí)間間隔的值。換句話說(shuō),它會(huì)復(fù)制上一個(gè)已知數(shù)據(jù)點(diǎn)的值來(lái)填充當(dāng)前缺失的時(shí)間間隔。例如,如果您有以下數(shù)據(jù)序列:
12:00 - 100
12:10 - 缺失
12:20 - 110
使用FILL(PREV)
進(jìn)行填充后,12:10的值將會(huì)被設(shè)定為前一時(shí)間點(diǎn)12:00的值,即100。
-
FILL(linear)
:與FILL(PREV)
不同的是,FILL(linear)
會(huì)對(duì)缺失的數(shù)據(jù)點(diǎn)使用線性插值填充。它假設(shè)相鄰的數(shù)據(jù)點(diǎn)之間的值變化是線性的,并且基于此來(lái)計(jì)算缺失點(diǎn)的值。比如,同樣的數(shù)據(jù)序列:
12:00 - 100
12:10 - 缺失
12:20 - 110
使用FILL(linear)
進(jìn)行填充后,12:10的值將會(huì)被設(shè)定為一個(gè)線性插入值,這個(gè)值將會(huì)介于12:00和12:20的值之間。在這個(gè)例子中,由于12:20的值增加了10(從100到了110),那么線性插值的結(jié)果將會(huì)是105。
選擇使用哪種方式取決于數(shù)據(jù)的性質(zhì)和特點(diǎn),以及您希望如何處理數(shù)據(jù)缺失的策略。FILL(PREV)
能夠保持?jǐn)?shù)據(jù)的平滑性,而FILL(linear)
則更適合處理數(shù)據(jù)變化趨勢(shì)較為連續(xù)的場(chǎng)景。
在某些時(shí)間序列數(shù)據(jù)庫(kù)中,如果遇到?jīng)]有數(shù)據(jù)的情況,你可能希望使用附近時(shí)間點(diǎn)的數(shù)據(jù)來(lái)填充這些缺失的數(shù)據(jù)點(diǎn)。在TDengine這樣的時(shí)間序列數(shù)據(jù)庫(kù)中,提供了幾種選項(xiàng)來(lái)處理這類情況,但功能的支持和具體實(shí)現(xiàn)可能會(huì)根據(jù)數(shù)據(jù)庫(kù)版本和配置而有所不同。
以下是常見的幾種方法來(lái)處理這種情況:
FILL(PREV)
:如前所述,這個(gè)選項(xiàng)會(huì)用前一個(gè)非空的數(shù)據(jù)點(diǎn)來(lái)填充當(dāng)前的空值。
FILL(NEXT)
:與FILL(PREV)
相對(duì),這個(gè)選項(xiàng)會(huì)用后一個(gè)非空的數(shù)據(jù)點(diǎn)來(lái)填充當(dāng)前的空值。
FILL(linear)
:對(duì)于缺失的時(shí)間點(diǎn),采用線性插值的方法基于周圍已知的數(shù)據(jù)點(diǎn)估算出缺失值。
FILL(NONE)
:不填充,即使有數(shù)據(jù)缺失,也不進(jìn)行處理,這將會(huì)保留數(shù)據(jù)的空缺狀態(tài)。使用子查詢或者窗口函數(shù):在不支持直接從附近時(shí)間點(diǎn)取數(shù)據(jù)的數(shù)據(jù)庫(kù)中,可能需要使用更為復(fù)雜的SQL查詢來(lái)實(shí)現(xiàn)。例如,可以用子查詢來(lái)尋找每個(gè)缺失數(shù)據(jù)點(diǎn)的前一個(gè)和后一個(gè)數(shù)據(jù)點(diǎn),并通過(guò)外部查詢邏輯來(lái)決定如何填充。
例如,在 PostgreSQL 的 TimescaleDB擴(kuò)展或者 MySQL 中,你可以使用窗口函數(shù)?LEAD()
?和?LAG()
?來(lái)訪問(wèn)時(shí)間序列中當(dāng)前行之前或之后的行。結(jié)合條件邏輯,這樣可以在沒有直接支持的情況下實(shí)現(xiàn)類似?FILL(PREV)
?或?FILL(NEXT)
?的功能。
在使用任何填充策略之前,請(qǐng)檢查你所使用的數(shù)據(jù)庫(kù)系統(tǒng)文檔來(lái)確認(rèn)支持的方法和正確的語(yǔ)法。如果你不確定如何操作,或者在嘗試標(biāo)準(zhǔn)方法時(shí)遇到問(wèn)題,可能需要考慮自定義SQL查詢或使用數(shù)據(jù)庫(kù)提供的程序功能來(lái)實(shí)現(xiàn)需求。
時(shí)間窗口?
時(shí)間窗口又可分為滑動(dòng)時(shí)間窗口和翻轉(zhuǎn)時(shí)間窗口。
INTERVAL 子句用于產(chǎn)生相等時(shí)間周期的窗口,SLIDING 用以指定窗口向前滑動(dòng)的時(shí)間。每次執(zhí)行的查詢是一個(gè)時(shí)間窗口,時(shí)間窗口隨著時(shí)間流動(dòng)向前滑動(dòng)。在定義連續(xù)查詢的時(shí)候需要指定時(shí)間窗口(time window )大小和每次前向增量時(shí)間(forward sliding times)。如圖,[t0s, t0e]?,[t1s , t1e],?[t2s, t2e]?是分別是執(zhí)行三次連續(xù)查詢的時(shí)間窗口范圍,窗口的前向滑動(dòng)的時(shí)間范圍 sliding time 標(biāo)識(shí) 。查詢過(guò)濾、聚合等操作按照每個(gè)時(shí)間窗口為獨(dú)立的單位執(zhí)行。當(dāng) SLIDING 與 INTERVAL 相等的時(shí)候,滑動(dòng)窗口即為翻轉(zhuǎn)窗口。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-815517.html
SELECT *,max(lp_index) FROM lp.tdm_lp_original_data
where lp_time_ticks >= '2023-06-03 18:11:33.521'
and lp_time_ticks <= '2023-12-29 19:03:12.148'
INTERVAL(20m) SLIDING(2m)
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-815517.html
到了這里,關(guān)于時(shí)序數(shù)據(jù)庫(kù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!