成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

第24期:聊一聊非等值分組

企業動態
等值分組在數學上的描述,相當于在一個集合上定義了一個等價關系,有等值分組和完全劃分,那是不是還有非等值分組和不完全劃分?還有沒有別的方式產生完全劃分?這些是否有業務意義呢?

非等值分組

我們在上一期研究了分組運算的實質,即將一個集合按某種規則拆分成若干子集。不過,上期的關注重點在于還原分組運算的步驟,而沒有討論拆分規則,例子中都是用某些字段(或表達式)來定義拆分規則,也就是SQL中使用的方法。

我們把這種拆分方式稱為等值分組。

一、

等值分組在數學上的描述,相當于在一個集合上定義了一個等價關系:分組字段(表達式)相等的成員(記錄)就認為等價。

等價關系是指滿足如下條件的關系:

1)交換性,若a=b則b=a

2)傳遞性,若a=b,b=c則a=c

3)排他性,對任何a,b,a=b和a!=b有且只有一個成立

可以證明,任何等價關系一定能把原集合完全劃分成若干個子集,每個子集中的成員互相等價。

完全劃分具有這樣的性質:

1)沒有空子集

2)原集合的任何成員都屬于且只屬于某一個子集

考查等值分組,我們會發現它能夠精確地滿足等價關系的定義,因而等值分組的結果一定是完全劃分。

二、

有等值分組和完全劃分,那是不是還有非等值分組和不完全劃分?還有沒有別的方式產生完全劃分?這些是否有業務意義呢?

答案是肯定的。

三、

比如我們要統計男女員工數量。我們可以寫成這樣:

  1. SELECT gender,COUNT(*) FROM employee GROUP BY gender 

但如果公司員工全是男性或女性,這個運算結果就只有一行了,那可能就不是我們想要的了。

為解決這個問題,我們可以設計這樣一種分組方案:先羅列出一個基準集合,然后將待分組集合成員的某個屬性(字段或表達式)與基準集合成員比較,相同者則分到一個子集中,***拆分出來的子集數量和基準集合成員數是相同的。這種分組我們稱為對位分組。

使用對位分組統計男女員工數量可以寫成這樣:

  1. a=[男,女]                                       // 基準集合 
  2. g=employee.align(a,gender)    // 設計函數align實現對位分組,拆分集合 
  3. g.new(a(#),~.len())                   // 用分組子集計算匯總 

可以想象,這種對位分組在日常統計中是很常見的,比如按地區、按部門統計,都可以事先把基準集合列出來,而且我們經常還要求結果集必須按基準集合的次序出現,而等值分組不能保證這個次序,還要再排序(排序時還是要提供這個基準集合,原集合成員屬性中沒有這個信息)。

對位分組可能出現空子集,它也不能保證任何原集合的成員都被拆到某個子集中(比如有些不重要的成員沒有被列入基準集合),不過對位分組能保證每個成員最多只出現在一個子集中。

四、

我們還能把對位分組推廣成更一般的枚舉分組。

枚舉分組是指,事先指定一組條件,將待分組集合的成員作為參數計算這批條件,條件成立者都被劃分到與該條件對應的一個子集中,結果集的子集和事先指定的條件一一對應。

比如,將員工按年齡段分組統計人數:

  1. a=[?<=30,?<=40,?>40]         // 用?表示要代入的參數 
  2. g=employee.enum(a,age)    // 設計函數enum實現枚舉分組,拆分集合 
  3. .... 

顯然,枚舉分組在日常業務中也是不少見的。

枚舉分組和對位分組很象,都需要先列出一個基準集合,事實上,對位分組就是一種特殊的枚舉分組。不過,不同的是,枚舉分組可能制造出有重復成員的子集,也就是可重分組。

  1. a=[?<=30,?>20 && ?<=40,?>50]      // 條件有重疊 
  2. g=employee.enum(a,age) 

可重分組在實際業務中相對罕見一些,不過了解一下也有助于再次理解分組運算的實質。

五、

表面上看,對位分組和枚舉分組和SQL的GROUP BY差別很大,但理解了分組運算的本質后,就會明白它們其實是一回事:把某個集合拆分成若干子集。只是拆分的方法各有不同。

還有其它不完全依賴于成員屬性的分組方式,但仍然是一種“把集合拆成子集”的方法,我們在后續文章會再提及。

六、

還有一個問題,SQL只提供了等值分組,那會不會不夠用呢?用SQL又是如何解決對位分組和枚舉分組問題的?

其實SQL的運算能力是完備的,上述兩種非等值分組都可以轉換成等值分組,就是會麻煩一些。

對于對位分組,可以用基準集合和待分組集合做LEFT JOIN,對這個結果集再做GROUP BY就可以得到相同的效果。注意一定要用LEFT JOIN,用JOIN可能會失去空子集,用FULL JOIN又會多出基準集合之外的成員。枚舉分組也是類似,但語句會更復雜些,要根據枚舉條件去設計JOIN的條件,難以給出通用寫法。

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2021-01-28 22:31:33

分組密碼算法

2020-05-22 08:16:07

PONGPONXG-PON

2023-09-22 17:36:37

2018-06-07 13:17:12

契約測試單元測試API測試

2019-02-13 14:15:59

Linux版本Fedora

2020-10-15 06:56:51

MySQL排序

2018-11-29 09:13:47

CPU中斷控制器

2022-11-01 08:46:20

責任鏈模式對象

2021-02-06 08:34:49

函數memoize文檔

2021-01-29 08:32:21

數據結構數組

2022-08-08 08:25:21

Javajar 文件

2021-08-04 09:32:05

Typescript 技巧Partial

2023-07-06 13:56:14

微軟Skype

2023-05-15 08:38:58

模板方法模式

2019-12-17 10:06:18

CDMA高通4G

2022-03-08 16:10:38

Redis事務機制

2020-09-08 06:54:29

Java Gradle語言

2022-03-29 09:56:21

游戲版本運營

2021-01-01 09:01:05

前端組件化設計

2020-06-28 09:30:37

Linux內存操作系統
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91精品国产日韩91久久久久久 | 精品日韩在线 | 亚洲不卡在线观看 | 午夜影院在线免费观看视频 | 亚洲精品一区二区三区在线 | 91电影在线播放 | 成人免费看片 | 99精品欧美一区二区三区综合在线 | 人人人人干| 国产精品久久久久久久久久久新郎 | wwww.xxxx免费 | 国产乱码精品一品二品 | 在线看片网站 | 欧美日韩精品一区二区三区四区 | 欧洲视频一区二区 | 国产精品黄色 | 精品久久久久久久人人人人传媒 | 91在线色视频 | 超级乱淫av片免费播放 | 91高清在线观看 | 欧美精品首页 | 伊人网综合在线观看 | 日韩在线观看中文字幕 | 欧美精品一区二区三区蜜桃视频 | 黄色一级网 | 中文字幕在线一区二区三区 | 国产丝袜一区二区三区免费视频 | 欧美aⅴ | av二区三区| 色综合99| 日韩一区二区三区视频 | 精品国产一区二区三区久久影院 | 久久午夜精品福利一区二区 | 国产中文视频 | 久久精品国产精品青草 | 99久久日韩精品免费热麻豆美女 | www.久久久久久久久久久久 | 麻豆久久久久 | 精品国产伦一区二区三区观看说明 | 久久高清亚洲 | 国产精品中文字幕在线 |