日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Sql Hacks 阅读感悟——数值处理

發布時間:2023/12/14 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Sql Hacks 阅读感悟——数值处理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

SQL基礎:《SQL HACKS》第5章——數值處理,總共列舉了17tips,計算結果集的乘積、計算累加和、包含Join遺忘的行等,下述為我對這17tips的評析。

#24 計算結果集的乘積

情景描述:計算多列的乘積

解決方案:通過數學手段,將乘積轉換為對數加法運算,log(a*b*c) = log(a)+log(b)+log(c)

評析:sql中數值處理,很多都是基于數學手段,如剛才的指數函數、對數函數,后續tips中提到的中位數、gps定位距離計算等。

#25 計算累加和

情景描述:表中存儲了每日的收支情況,要求計算每日的收支余額

解決方案:根據時間發生順序做表自連,計算累加和

評析:熟練使用匯聚函數如sum,可以有效進行行匯總。通常在財務等處理上,我們記錄的都是每日發生額,要計算每日的現金、銀行存款余額就需要計算累加和。

#26 包含Join遺忘的行

情景描述:在連表時,我們經常會遺漏null條件的記錄。如求每位員工的2月份出勤信息時,假設員工A沒有2月份請病假,沒有出勤記錄,則通過連表員工信息表、考勤信息表時,就會略去員工A(給人感覺員工A離職了)。

解決方案:通過外聯,null用特殊值(如0)來代替處理。

評析:合理利用外聯,處理好null會有很多妙用。

#27 識別重疊范圍

情景描述:求職人員有期望薪金區間required, r= [l,h],提供的工作有薪金范圍offered, o= [l,h],尋找requiredoffered有交集的行記錄。

解決方案:如何判斷requiredoffered是否有交集,可以直接的用下述來表示,

1r.h<=o.l

2) r.l>=o.l and r.h>=o.h

3) r.l<=o.l and r.h<=o.h

評析:區間比對的情況往往可以用邊界值做反比可以解決問題,如果編輯值為null,則需要將null做最小、最大化處理。如上述的比較則完全可以用

r.h>=o.l and r.l<=o.h

#28避免零做除數

評析:轉換nullsql中有很多null轉換處理函數,如pgsqlcoalesce

#29 計算行數的其它途徑

評析:計算行數有 select count(*), select count(1), select count(字段),需要注意的是如果用select count(字段)計算行數的話,則如果值為null,則會被略去。因此select count(*) 得到10的話,用 select count(字段)得到的可能是9。

#30 計算2個字段的最大值

情景描述:2個字段x、y,計算x、y的最大值

解決方案:運用數學手段實現,(x+y+abs(x-y))/2,實現x,y的最大值

評析:簡單、靈活運用數學手段即可解決復雜問題,當然用case when x>y then x else y end也可實現x,y的最大值。

#31 反聚合count

評析:反計數問題是sql中一個比較難處理的問題,通??梢酝ㄟ^使用一個整數表來解決這個問題。如本案的新建integers表,create table integers(n integer);

#32 服舍入誤差

情景描述:計算某個字段的百分比值,如銷售額amount,折扣率percent,求銷售折扣。

解決方案:銷售折扣 = 銷售額 * 折扣率,貌似很簡單,但是如涉及到匯總即小數位截位問題的話,則很有可能出現舍入誤差。增加計算列 f=round(amount+percent,2),然后對f匯總即可。

評析:對于小數截位問題,我們一定要注意舍入誤差問題。對于本案要嘛先截后加,要嘛先加后截,切忌邊截邊加。

#33 同時得到值和小計

情景描述:給定記錄集合S,要求用sql語句得到集合集合TT=S U S的小計。

解決方案:得到S的小計 然后 union S 并按照特定列排序即可同時得到值和小計。

評析:該處實際上就是select union方式的運用,那么我們就要注意INTERSECT、EXCEPT的運用。

#34 計算中位數

情景描述:給定從小到大排序的集合S,找出S中間位置的元素,奇數集合時為第(n+1)/2個元素,偶數集合時為第n/2,n/2+1元素的平均值。

解決方案:創建臨時表得到帶有從小到大排序位置信息(簡單理解為行號)的新集合N,然后利用N根據簡單的中位數算法即可求解中位數。

Select avg(minutes) from taski, (select count(*) n from task) t

Where posn in (floor(n+1)/2, floor(n/2)+1)

評析:個人認為類似計算中位數,應該在具體應用去實現,或者定義成一個存儲過程或者函數(pgsql 是函數)。但是,計算中位數中用到的一個技巧得到行號(posn)是一個很有用的tip。

#35 將結果展示為圖表

評析:本tip核心就是字串函數的靈活運用,如填充字符串repeat, lpad等。

#36 計算GPS定位之間的距離

評析:本tips核心就是數學知識幾何學的運用,因此不予展開。

#37 讓貨物清單和支付清單對應起來

評析:本例的一個典型應用就是會計行業的銀行對賬,會計人員總是會做銀行對賬單和銀行、現金發生額間的勾稽關系。由于具體的應用有其特殊的技巧,因此本tip不予展開。

#38 找出換位錯誤

評析:本案類似于#37,沒對上的那個肯定是錄錯了。但是本案有個技巧需要引起我們的注意,那就是快速定位換位錯誤。發生誤差為9的倍數時,我們首先想到的是錄入的時候發生了換位錯誤,入102錄成了120等。

誤差18,為92倍,則發生換位錯誤的可能組合為02, 13, 24, 35, 57, 68, 79。因此我們只要查找02,13,24,35,57,68,79結尾的值即可馬上定位到發生換位錯誤的那個值。

#39 計算累進稅

評析:作者對稅級低限、稅級高限邊界值的靈活處理以及巧妙的crossjoin得到了納稅人員的累進稅額。個人認為,由于稅率表、人員信息表都是基本信息表記錄數是有限的給定集合,因此可以編寫一個函數getFunctionalTax(),傳入納稅人員的收入,輸出納稅人員的累進稅額,更加可取。

#40 計算名次

評析:rank函數的應用。

總結

以上是生活随笔為你收集整理的Sql Hacks 阅读感悟——数值处理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。