溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

SQL怎么在時間序列中根據(jù)字段變化分組

發(fā)布時間:2022-01-15 15:51:14 來源:億速云 閱讀:209 作者:柒染 欄目:大數(shù)據(jù)

今天就跟大家聊聊有關(guān)SQL怎么在時間序列中根據(jù)字段變化分組,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

將排序(一般按時間排)后的數(shù)據(jù)按某字段變化分組統(tǒng)計,也就是分組字段值與上一行的值比較,如果相同則分到與上一行同組,不同時則創(chuàng)建一個新組。

這個問題用SQL來做很難!

SQL的集合是無序的,早期SQL沒有相鄰行引用的方法。SQL2003標準中加入了窗口函數(shù),能引用相鄰行,但分組仍然非常困難,需要用子查詢?nèi)藶樵斐龇纸M序號。

舉個例子:查詢?nèi)藛T某段時間所處城市,并列出起始和結(jié)束時間。現(xiàn)有數(shù)據(jù)庫表footmark數(shù)據(jù)如下:

NAMEFOOTDATECITY
Tom    2020-01-02 08:30:00Beijing
Tom    2020-01-03 08:30:00Beijing
Tom    2020-01-04 13:30:05Beijing
Tom    2020-01-04 16:36:00Chengdu
Tom    2020-01-05 08:30:00Chengdu
Tom    2020-01-06 12:30:00Chengdu
Tom    2020-01-06 17:30:25Beijing
Tom    2020-01-07 09:30:05Beijing
Tom    2020-01-09 16:30:00Beijing

要求最終分組統(tǒng)計的結(jié)果如下:

NAMECITYSTARTDATEENDDATE
TomBeijing2020-01-02 08:30:002020-01-04 13:30:05
Tom    Chengdu2020-01-04 16:36:002020-01-06 12:30:00
Tom    Beijing2020-01-06 17:30:252020-01-09 16:30:00

以O(shè)racle為例,用SQL寫出來是這樣:

WITH A AS

       ( SELECT NAME, FOOTDATE, CITY,

              CASE WHEN CITY=LAG(CITY) OVER (PARTITION BY NAME ORDER BY FOOTDATE) THEN 0 ELSE ROWNUM END FLAG

       FROM FOOTMARK ORDER BY NAME, FOOTDATE),

B AS

       ( SELECT NAME, FOOTDATE, CITY,

              MAX(FLAG) OVER (PARTITION BY NAME ORDER BY FOOTDATE) FLAG

       FROM A),

C AS

       ( SELECT NAME, CITY, FLAG,

MIN(FOOTDATE) STARTDATE,

MAX(FOOTDATE) ENDDATE

       FROM B

GROUP BY NAME, CITY, FLAG

ORDER BY NAME, FLAG )

SELECT NAME, CITY, STARTDATE, ENDDATE FROM C;

這里的FLAG就是人為造出的分組序號,這種SQL既難寫又難懂。

對于這種按順序分組,如果使用集算器的SPL語言就會簡單很多,只需1行代碼:

connect("mydb").query("SELECT * FROM FOOTMARK ORDER BY NAME,FOOTDATE").groups@o(NAME,CITY;min(FOOTDATE):STARTDATE,max(FOOTDATE):ENDDATE)

SPL基于有序集合實現(xiàn),提供了按有序分組的選項@o,解決這個問題非常容易。

SPL提供了等值分組、有序分組、有序條件分組、序號分組、嵌套分組、大數(shù)據(jù)有序分組、大數(shù)據(jù)有序條件分組等多種分組方式。

集算器 SPL 是解決 SQL 難題的專業(yè)腳本語言,它語法簡單,符合自然思維,是天然分步、層次清晰的面向過程計算語言。它采用與數(shù)據(jù)庫無關(guān)的統(tǒng)一語法,編寫的算法可在數(shù)據(jù)庫間無縫遷移。它是桌面級計算工具,即裝即用,配置簡單,調(diào)試功能完善,可設(shè)置斷點、單步執(zhí)行,每步執(zhí)行結(jié)果都可查看。

看完上述內(nèi)容,你們對SQL怎么在時間序列中根據(jù)字段變化分組有進一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

sql
AI