119
技術社區[雲棲]
數據蔣堂 | 非等值分組
我們在上一期研究了分組運算的實質,即將一個集合按某種規則拆分成若幹子集。不過,上期的關注重點在於還原分組運算的步驟,而沒有討論拆分規則,例子中都是用某些字段(或表達式)來定義拆分規則,也就是SQL中使用的方法。
我們把這種拆分方式稱為等值分組。
等值分組在數學上的描述,相當於在一個集合上定義了一個等價關係:分組字段(表達式)相等的成員(記錄)就認為等價。
等價關係是指滿足如下條件的關係:
1)交換性,若a=b則b=a
2)傳遞性,若a=b,b=c則a=c
3)排他性,對任何a,b,a=b和a!=b有且隻有一個成立
可以證明,任何等價關係一定能把原集合完全劃分成若幹個子集,每個子集中的成員互相等價。
完全劃分具有這樣的性質:
1)沒有空子集
2)原集合的任何成員都屬於且隻屬於某一個子集
考查等值分組,我們會發現它能夠精確地滿足等價關係的定義,因而等值分組的結果一定是完全劃分。
有等值分組和完全劃分,那是不是還有非等值分組和不完全劃分?還有沒有別的方式產生完全劃分?這些是否有業務意義呢?
答案是肯定的。
比如我們要統計男女員工數量。我們可以寫成這樣:
SELECT gender,COUNT(*) FROM employee GROUP BY gender
但如果公司員工全是男性或女性,這個運算結果就隻有一行了,那可能就不是我們想要的結果了。
為解決這個問題,我們可以設計這樣一種分組方案:先羅列出一個基準集合,然後將待分組集合成員的某個屬性(字段或表達式)與基準集合成員比較,相同者則分到一個子集中,最後拆分出來的子集數量和基準集合成員數是相同的,這種分組我們稱為對位分組。
使用對位分組統計男女員工數量可以寫成這樣:
a=[男,女] // 基準集合
g=employee.align(a,gender) // 設計函數align實現對位分組,拆分集合
g.new(a(#),~.len()) // 用分組子集計算匯總
可以想象,這種對位分組在日常統計中是很常見的,比如按地區、按部門統計,都可以事先把基準集合列出來,而且我們經常還要求結果集必須按基準集合的次序出現。但等值分組不能保證這個次序,還要再排序(排序時還是要提供這個基準集合,原集合成員屬性中沒有這個信息)。
對位分組可能出現空子集,它也不能保證任何原集合的成員都被拆到某個子集中(比如有些不重要的成員沒有被列入基準集合),不過對位分組能保證每個成員最多隻出現在一個子集中。
我們還能把對位分組推廣成更一般的枚舉分組。
枚舉分組是指,事先指定一組條件,然後將待分組集合的成員作為參數計算這批條件,條件成立者都被劃分到與該條件對應的一個子集中,結果集的子集和事先指定的條件一一對應。
比如,將員工按年齡段分組統計人數:
a=[?<=30,?<=40,?>40] // 用?表示要代入的參數
g=employee.enum(a,age) // 設計函數enum實現枚舉分組,拆分集合
....
顯然,枚舉分組在日常業務中也是不少見的。
枚舉分組和對位分組很像,都需要先列出一個基準集合,事實上,對位分組就是一種特殊的枚舉分組。不過,不同的是,枚舉分組可能製造出有重複成員的子集,也就是可重分組。
a=[?<=30,?>20 && ?<=40,?>50] // 條件有重疊
g=employee.enum(a,age)
可重分組在實際業務中相對罕見一些,不過了解一下也有助於再次理解分組運算的實質。
表麵上看,對位分組和枚舉分組和SQL的GROUP BY差別很大,但理解了分組運算的本質後就會明白它們其實是一回事:把某個集合拆分成若幹子集。隻是它們拆分的方法各有不同。
還有其它不完全依賴於成員屬性的分組方式,但仍然是一種“把集合拆成子集”的方法,我們在後續文章會再提及。
還有一個問題,SQL隻提供了等值分組,那會不會不夠用呢?用SQL又是如何解決對位分組和枚舉分組問題的?
其實SQL的運算能力是完備的,上述兩種非等值分組都可以轉換成等值分組,但就是會麻煩一些。
對於對位分組,可以用基準集合和待分組集合做LEFT JOIN,對這個結果集再做GROUP BY就可以得到相同的效果。注意一定要用LEFT JOIN,用JOIN可能會失去空子集,用FULL JOIN又會多出基準集合之外的成員。枚舉分組也是類似,但語句會更複雜些,要根據枚舉條件去設計JOIN的條件,一般難以給出通用寫法。
清華大學計算機碩士,著有《非線性報表模型原理》等,1989年,中國首個國際奧林匹克數學競賽團體冠軍成員,個人金牌;2000年,創立潤乾公司;2004年,首次在潤乾報表中提出非線性報表模型,完美解決了中國式複雜報表製表難題,目前該模型已經成為報表行業的標準;2014年,經過7年開發,潤乾軟件發布不依賴關係代數模型的計算引擎——集算器,有效地提高了複雜結構化大數據計算的開發和運算效率;2015年,潤乾軟件被福布斯中文網站評為“2015福布斯中國非上市潛力企業100強”;2016年,榮獲中國電子信息產業發展研究院評選的“2016年中國軟件和信息服務業十大領軍人物”;2017年, 自主創新研發新一代的數據倉庫、雲數據庫等產品即將麵世。
《數據蔣堂》的作者蔣步星,從事信息係統建設和數據處理長達20多年的時間。他豐富的工程經驗與深厚的理論功底相互融合、創新思想與傳統觀念的相互碰撞,虛擬與現實的相互交織,產生出了一篇篇的瀝血之作。此連載的內容涉及從數據呈現、采集到加工計算再到存儲以及挖掘等各個方麵。大可觀數據世界之遠景、小可看技術疑難之細節。針對數據領域一些技術難點,站在研發人員的角度從淺入深,進行全方位、360度無死角深度剖析;對於一些業內觀點,站在技術人員角度闡述自己的思考和理解。蔣步星還會對大數據的發展,站在業內專家角度給予預測和推斷。靜下心來認真研讀你會發現,《數據蔣堂》的文章,有的會讓用戶避免重複前人走過的彎路,有的會讓攻城獅麵對紮心的難題茅塞頓開,有的會為初入行業的讀者提供一把開啟數據世界的鑰匙,有的甚至會讓業內專家大跌眼鏡,產生思想交鋒。
原文發布時間為:2017-09-29
本文作者:蔣步星
本文來自雲棲社區合作夥伴“數據派THU”,了解相關信息可以關注“數據派THU”微信公眾號
最後更新:2017-10-10 10:34:44