今天就跟大家聊聊有關(guān)SQL怎么在時(shí)間序列中根據(jù)字段變化分組,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
創(chuàng)新互聯(lián)建站服務(wù)項(xiàng)目包括桑珠孜網(wǎng)站建設(shè)、桑珠孜網(wǎng)站制作、桑珠孜網(wǎng)頁(yè)制作以及桑珠孜網(wǎng)絡(luò)營(yíng)銷策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,桑珠孜網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到桑珠孜省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
將排序(一般按時(shí)間排)后的數(shù)據(jù)按某字段變化分組統(tǒng)計(jì),也就是分組字段值與上一行的值比較,如果相同則分到與上一行同組,不同時(shí)則創(chuàng)建一個(gè)新組。
這個(gè)問題用SQL來(lái)做很難!
SQL的集合是無(wú)序的,早期SQL沒有相鄰行引用的方法。SQL2003標(biāo)準(zhǔn)中加入了窗口函數(shù),能引用相鄰行,但分組仍然非常困難,需要用子查詢?nèi)藶樵斐龇纸M序號(hào)。
舉個(gè)例子:查詢?nèi)藛T某段時(shí)間所處城市,并列出起始和結(jié)束時(shí)間。現(xiàn)有數(shù)據(jù)庫(kù)表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)計(jì)的結(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寫出來(lái)是這樣:
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就是人為造出的分組序號(hào),這種SQL既難寫又難懂。
對(duì)于這種按順序分組,如果使用集算器的SPL語(yǔ)言就會(huì)簡(jiǎn)單很多,只需1行代碼:
connect("mydb").query("SELECT * FROM FOOTMARK ORDER BY NAME,FOOTDATE").groups@o(NAME,CITY;min(FOOTDATE):STARTDATE,max(FOOTDATE):ENDDATE)
SPL基于有序集合實(shí)現(xiàn),提供了按有序分組的選項(xiàng)@o,解決這個(gè)問題非常容易。
SPL提供了等值分組、有序分組、有序條件分組、序號(hào)分組、嵌套分組、大數(shù)據(jù)有序分組、大數(shù)據(jù)有序條件分組等多種分組方式。
集算器 SPL 是解決 SQL 難題的專業(yè)腳本語(yǔ)言,它語(yǔ)法簡(jiǎn)單,符合自然思維,是天然分步、層次清晰的面向過(guò)程計(jì)算語(yǔ)言。它采用與數(shù)據(jù)庫(kù)無(wú)關(guān)的統(tǒng)一語(yǔ)法,編寫的算法可在數(shù)據(jù)庫(kù)間無(wú)縫遷移。它是桌面級(jí)計(jì)算工具,即裝即用,配置簡(jiǎn)單,調(diào)試功能完善,可設(shè)置斷點(diǎn)、單步執(zhí)行,每步執(zhí)行結(jié)果都可查看。
看完上述內(nèi)容,你們對(duì)SQL怎么在時(shí)間序列中根據(jù)字段變化分組有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。
新聞標(biāo)題:SQL怎么在時(shí)間序列中根據(jù)字段變化分組
URL標(biāo)題:http://bm7419.com/article20/igspco.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、網(wǎng)站收錄、云服務(wù)器、移動(dòng)網(wǎng)站建設(shè)、網(wǎng)站維護(hù)、外貿(mào)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)