您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關(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ù)如下:
NAME | FOOTDATE | CITY |
Tom | 2020-01-02 08:30:00 | Beijing |
Tom | 2020-01-03 08:30:00 | Beijing |
Tom | 2020-01-04 13:30:05 | Beijing |
Tom | 2020-01-04 16:36:00 | Chengdu |
Tom | 2020-01-05 08:30:00 | Chengdu |
Tom | 2020-01-06 12:30:00 | Chengdu |
Tom | 2020-01-06 17:30:25 | Beijing |
Tom | 2020-01-07 09:30:05 | Beijing |
Tom | 2020-01-09 16:30:00 | Beijing |
… | … | … |
要求最終分組統(tǒng)計的結(jié)果如下:
NAME | CITY | STARTDATE | ENDDATE |
Tom | Beijing | 2020-01-02 08:30:00 | 2020-01-04 13:30:05 |
Tom | Chengdu | 2020-01-04 16:36:00 | 2020-01-06 12:30:00 |
Tom | Beijing | 2020-01-06 17:30:25 | 2020-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è)資訊頻道,感謝大家的支持。
免責聲明:本站發(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)容。