天天看點

SQLServer · 特性分析 · SQL Server 2012的分析函數未必都了解透了(1)1. 背景1. 分析函數CUME_DIST2. 分析函數LAST_VALUE3. 分析函數FIRST_VALUE4. 分析函數LEAD

title: sqlserver · 特性分析 · sql server 2012的分析函數未必都了解透了

最近有使用者在做一些項目,使用到sql server 2012的一些新特性,比如sql server 提供的8個非常有用的分析函數,一開始我看了相關的文檔,感覺内容很多,了解不清楚,不透徹。而我現在想來,其實不需要那麼清楚,我覺得值要了解他的基本用法就足以應對工作,下面根據我的了解,以最簡單的方式解析這些分析函數。

微軟的定義:

計算某個值在 sql server 2012 中的一組值内的累積分布。cume_dist 計算某指定值在一組值中的相對位置。 對于行 r,假定采用升序,r 的 cume_dist 是值低于或等于 r 的值的行數除以在分區或查詢結果集中求出的行數。

其實,我看了也不是很懂,我們看一個執行個體,就很清楚了。

首先,我們構造一組資料:

然後我們再看看結果:

SQLServer · 特性分析 · SQL Server 2012的分析函數未必都了解透了(1)1. 背景1. 分析函數CUME_DIST2. 分析函數LAST_VALUE3. 分析函數FIRST_VALUE4. 分析函數LEAD

這是個什麼意思呢? 按照dept分組,根據salary邏輯排序,針對每一個分組裡的每一個值,在該分組下等于或者小于自己的salary的分布百分比。舉個例子,bd部門的andy02,salary為12000,那麼等于或者小于這個12000的有4條,總共5條記錄,是以那麼cume_dist()=4/5 = 0.8。 同理,其他也是如此計算,這下就明白了吧。

傳回 sql server 2012 中有序值集中的最後一個值。

好像我還是不太懂。那麼還是看看一個示例吧:

我們再看看這個運作結果:

SQLServer · 特性分析 · SQL Server 2012的分析函數未必都了解透了(1)1. 背景1. 分析函數CUME_DIST2. 分析函數LAST_VALUE3. 分析函數FIRST_VALUE4. 分析函數LEAD

這個意思是按照over子句中order by 根據salary排序,取salary最後行的hiredate值作為最後的last value,重點在于salary有相同時需要取salary排序後的最後一條作為其他的last value。

傳回 sql server 2012 中有序值集中的第一個值。 從這個地方看起來,似乎跟last_value是相反的一個意思,實際上是不是這樣,我們來看看執行個體:

SQLServer · 特性分析 · SQL Server 2012的分析函數未必都了解透了(1)1. 背景1. 分析函數CUME_DIST2. 分析函數LAST_VALUE3. 分析函數FIRST_VALUE4. 分析函數LEAD

顯然,這個與last_value不是同一個意思,over子句根據order by 來排序,按dept分組來确定這個分組的第一個值,而不是根據salary的值來确定的,是以與last_value是不一樣的,将first_value(name)修改為first_value(hiredate)後,對比看得更清楚。這個很有蒙蔽性。

通路相同結果集的後續行中的資料,而不使用 sql server 2012 中的自聯接。 lead 以目前行之後的給定實體偏移量來提供對行的通路。 在 select 語句中使用此分析函數可将目前行中的值與後續行中的值進行比較。

感覺這個好了解多了。不過我們還是看看一個示例來說明:

我們再看看結果:

SQLServer · 特性分析 · SQL Server 2012的分析函數未必都了解透了(1)1. 背景1. 分析函數CUME_DIST2. 分析函數LAST_VALUE3. 分析函數FIRST_VALUE4. 分析函數LEAD

這個還是比較容易了解的。按照dept分區,根據salary排序,比較目前記錄和後一條記錄(偏移量為1)的salary值的內插補點,這個非常的使用

後面還有4個函數,下一篇分析:lag,percent_rank ,percentile_disc,percentile_cont