
【每周一期-數據蔣堂】SQL的有序分組
我們知道,SQL延用了數學上的無序集合概念,所以SQL的分組并不關注過待分組集合中成員的次序。我們在前面討論過的等值分組和非等值分組,也都沒有關注過這個問題,分組規則都是建立在成員取值本身上。但如果我們要拓展SQL,以有序集合為考慮對象時,那就必須考慮成員次序對分組的影響了,而且,現實業務中有大量的有序分組應用場景。
一個簡單的例子:將一個班的學生平均分成三份(假定人數能被3整除)。按我們在前面所說的分組定義,這也可以看成是一種分組,但這個運算在SQL中卻很難寫出來,因為分組依據和成員取值沒有關系。
如果使用我們在前面講有序遍歷語法時的#符號,這個問題就很容易解決了。
A.group( (#-1)*3\A.len() ) // 按序號分成前1/3,中1/3,后1/3
A.group( (#-1)%3 ) // 還可以按序號每三個中取一個構成分組子集
用SQL實現這個運算就麻煩很多,需要先用子查詢造出一個序號,然后再執行類似的分組規則。
上面這個例子中其實還沒有真正關注成員的次序,只是說明了序號的作用,待分組集合的成員是其它次序時也可以得到可用的結果。
我們再看更多例子。
處理文本日志時,有些日志的基本單位不是1行,而可能是3行,即每個事件總是寫出3行文本,這并不是多罕見的情況。對付這種日志時,就需要把文本每3行拆成一個分組子集,然后針對每個分組再進行詳細的分析處理。這時要正確的分組運算就必須依賴于待分組集合中成員(文本日志的行)的次序了。
入學考試之后,把學生按成績排序蛇行分拆成兩個班,即名次1,4,5,8,...在一個,而2,3,6,7,...在另一個班,這樣能保證兩個班的平均名次是相同的。這個分組也可以用序號做出來:
A.sort@z(score).group(#%4<2)
這里用的分組值不再是常見的普通數值,而是一個布爾量,相當于按“真“值和“假”值分成兩個組,真值對應第一個班,假值對應另一個班。本質上講,這還是個等值分組,只是用到的分組值可以是任意泛型。
顯然,這個分組的正確性也嚴重依賴于待分組集成的成員次序。
順便說一句,這又是一個只關注分組子集而不關心聚合值的例子。按序號分組在很多情況下就是用序號來計算出分組依據,然后就變成普通的等值分組了。那么有沒有不能簡單地轉換成等值分組的情況呢?
有一組嬰兒出生記錄,是按出生次序排序的,我們現在關心連續出生的同性別嬰兒數量超過5的有多少批?
簡單想,這就是先GROUP,計算每組COUNT值,然后數出有幾個大于5的。后兩步很簡單,問題是怎么GROUP?
直接按嬰兒性別分組當然是不對的,必須考慮次序,依次掃描記錄,當嬰兒性別發生變化時則產生一個新組。這種分組顯然沒法直接用等值分組做出來了。
我們可以提供一個有序分組方法來實現這種分組:當考察值發生變化時就產生一個新的分組。
A.group@o(gender).count(~.len()>5) // @o選項表示分組值變化時將產生新分組。
用SQL就麻煩很多,需要先造成中間標志和變量來生成組的序號,大概是這樣
SELECT COUNT(*) FROM
(SELECT ChangeNumber FROM
(SELECT SUM(ChangeFlag) OVER (ORDER BY birthday) ChangeNumber FROM
(SELECT CASE WHEN gender=LAG(gender) OVER ( ORDER BY birthday) THEN 0 ELSE 1 END ChangeFlag FROM A))
GROUP ChangeNumber HAVING COUNT(*)>5)
這樣的SQL,看懂都不是很容易的。而且必須借助birthday這種字段來形成次序,而前述的有序分組寫法在原數據有序時根本用不著這個信息。
這種場景同樣可能出現在文本分析中。每個用戶的事件日志可能多行,而且行數不確定,但寫日志時會在每個行開始處寫上用戶號。這樣我們可以按這個用戶號進行有序分組,它變化時就說明是另一個用戶的事件了。
即使是普通的等值分組,如果事先知道原集合對分組字段有序,也可以使用這種方案來實施,這將獲得更高的性能,比數據庫常用的HASH分組方案要快得多,而且特別適合大數據遍歷的情況。
再看一個著名的問題:一支股票最長連續上漲了多少天?
這個問題當然可以直接遍歷去解決,不過我們現在用分組的思路來處理,至少在SQL體系下只能這么做(嚴格些說,這是目前找到的最簡單可行的辦法)。
將股票收盤價按日期排序,然后將連續上漲的日期分到同一組,這樣只要考慮哪一組成員數最多即可。更明確地說,就是當某天上漲了,就把這一天和前一天分到一個組中,某天下跌了,則產生一個新組。
用SQL實現這個思路,同樣需要用中間標志和變量來生成組序號:
SELECT MAX(ContinuousDays) FROM
(SELECT COUNT(*) ContinuousDays FROM
(SELECT SUM(RisingFlag) OVER (ORDER BY TradingDate ) NoRisingDays FROM
(SELECT TradingDate,
CASE WHEN ClosingPrice>LAG(ClosingPrice) OVER (ORDER BY TradingDate THEN 0 ELSE 1 END) RisingFlag
FROM A))
GROUP BY NoRisingDays)
如果有專門的有序分組方法以及以前說過的有序遍歷語法,這個運算就很簡單了:
A.sort(TradingDate).group@i(ClosingPrice
與SQL不同,雖然實現思路完全一樣,但寫出來是分步的,而不是一個多層嵌套語句,書寫和理解都要容易得多。
同樣地,這種場景也會在文本分析中有用。不確定行數的日志中,有時會在事件分始時寫一個標志串,當掃描到這個標志串的時候就產生一個新的分組,有序分析的條件可設定為當前掃描行和指定文字相同,這樣就能保證同一事件的日志信息在同一個組中。
后兩種有序分組的情況,理論上當然也可以轉換成等值分組來處理(用SQL就要這么做,這也能從另一個側面說明SQL運算體系的完備性),但確實是相當麻煩的,所以我們一般不把它再當成等值分組來處理了。
到目前為止的分組討論,都是假定待分組集合已經準備好,其成員可以被隨機訪問到。但如果數據量巨大而不能全部讀入時,如果繼續做這種假定,會導致頻繁的外存交換而性能極差,這時需要再設計以流方式邊讀入邊分組并且邊聚合的運算體系。事實上日志分析中更常見的是這種情況,這些問題我們將再撰文研究,但基本方法思路仍然離不開上面這些內容。
數據分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
CDA數據分析師證書考試體系(更新于2025年05月22日)
2025-05-26解碼數據基因:從數字敏感度到邏輯思維 每當看到超市貨架上商品的排列變化,你是否會聯想到背后的銷售數據波動?三年前在零售行 ...
2025-05-23在本文中,我們將探討 AI 為何能夠加速數據分析、如何在每個步驟中實現數據分析自動化以及使用哪些工具。 數據分析中的AI是什么 ...
2025-05-20當數據遇見人生:我的第一個分析項目 記得三年前接手第一個數據分析項目時,我面對Excel里密密麻麻的銷售數據手足無措。那些跳動 ...
2025-05-20在數字化運營的時代,企業每天都在產生海量數據:用戶點擊行為、商品銷售記錄、廣告投放反饋…… 這些數據就像散落的拼圖,而相 ...
2025-05-19在當今數字化營銷時代,小紅書作為國內領先的社交電商平臺,其銷售數據蘊含著巨大的商業價值。通過對小紅書銷售數據的深入分析, ...
2025-05-16Excel作為最常用的數據分析工具,有沒有什么工具可以幫助我們快速地使用excel表格,只要輕松幾步甚至輸入幾項指令就能搞定呢? ...
2025-05-15數據,如同無形的燃料,驅動著現代社會的運轉。從全球互聯網用戶每天產生的2.5億TB數據,到制造業的傳感器、金融交易 ...
2025-05-15大數據是什么_數據分析師培訓 其實,現在的大數據指的并不僅僅是海量數據,更準確而言是對大數據分析的方法。傳統的數 ...
2025-05-14CDA持證人簡介: 萬木,CDA L1持證人,某電商中廠BI工程師 ,5年數據經驗1年BI內訓師,高級數據分析師,擁有豐富的行業經驗。 ...
2025-05-13CDA持證人簡介: 王明月 ,CDA 數據分析師二級持證人,2年數據產品工作經驗,管理學博士在讀。 學習入口:https://edu.cda.cn/g ...
2025-05-12CDA持證人簡介: 楊貞璽 ,CDA一級持證人,鄭州大學情報學碩士研究生,某上市公司數據分析師。 學習入口:https://edu.cda.cn/g ...
2025-05-09CDA持證人簡介 程靖 CDA會員大咖,暢銷書《小白學產品》作者,13年頂級互聯網公司產品經理相關經驗,曾在百度、美團、阿里等 ...
2025-05-07相信很多做數據分析的小伙伴,都接到過一些高階的數據分析需求,實現的過程需要用到一些數據獲取,數據清洗轉換,建模方法等,這 ...
2025-05-06以下的文章內容來源于劉靜老師的專欄,如果您想閱讀專欄《10大業務分析模型突破業務瓶頸》,點擊下方鏈接 https://edu.cda.cn/g ...
2025-04-30CDA持證人簡介: 邱立峰 CDA 數據分析師二級持證人,數字化轉型專家,數據治理專家,高級數據分析師,擁有豐富的行業經驗。 ...
2025-04-29CDA持證人簡介: 程靖 CDA會員大咖,暢銷書《小白學產品》作者,13年頂級互聯網公司產品經理相關經驗,曾在百度,美團,阿里等 ...
2025-04-28CDA持證人簡介: 居瑜 ,CDA一級持證人國企財務經理,13年財務管理運營經驗,在數據分析就業和實踐經驗方面有著豐富的積累和經 ...
2025-04-27數據分析在當今信息時代發揮著重要作用。單因素方差分析(One-Way ANOVA)是一種關鍵的統計方法,用于比較三個或更多獨立樣本組 ...
2025-04-25CDA持證人簡介: 居瑜 ,CDA一級持證人國企財務經理,13年財務管理運營經驗,在數據分析就業和實踐經驗方面有著豐富的積累和經 ...
2025-04-25