技術(shù) 點(diǎn)
- 技術(shù)
- 點(diǎn)
- V幣
- 點(diǎn)
- 積分
- 21536
|
本帖最后由 todaynew 于 2015-7-28 17:57 編輯
前日里為一版友解決中位數(shù)問題,曾寫《入鄉(xiāng)隨俗》一文,在該文中對中位數(shù)采用自定義函數(shù)方式處理。這種方法存在一個(gè)問題,就是當(dāng)Access做后臺(tái)時(shí),其中的查詢?nèi)绻{(diào)用自定義函數(shù)的話,那么數(shù)據(jù)是無法在前臺(tái)讀出來的。究其原因大概是Access不像SQL SERVER可以提供數(shù)據(jù)庫服務(wù),它不能自動(dòng)運(yùn)行后臺(tái)的程序和自定義函數(shù)。由于這樣的一個(gè)原因,就需要采用SQL語句來直接編寫后臺(tái)的查詢,以便前臺(tái)的調(diào)用。
中位數(shù)是指一組數(shù)據(jù)由小到大排序后,如果記錄條數(shù)為奇數(shù)則取其中間位置的數(shù)據(jù),如果為偶數(shù)則取中間兩數(shù)的平均數(shù)。編寫中位數(shù)查詢還是有一些難度的,其難度有二:其一是如何統(tǒng)一記錄條數(shù)為奇數(shù)和偶數(shù)的算法,也就是一個(gè)算式要同時(shí)滿足兩種情況的運(yùn)算;其二是如何進(jìn)行高效率的運(yùn)算。
為了簡化中位數(shù)查詢的SQL語句,我們可以先編寫一個(gè)“編號(hào)查詢”。這個(gè)查詢中我們解決兩個(gè)問題,其一是對記錄按照分組編出序號(hào);其二是我們設(shè)計(jì)兩個(gè)中位數(shù)位置。如果記錄條數(shù)為偶數(shù),比如6條記錄,那么有兩個(gè)中位數(shù)分別處于3和4。問題在于當(dāng)記錄條數(shù)為奇數(shù)時(shí),比如7條記錄,中位數(shù)處于4,只有一個(gè)中位數(shù)位置。為了統(tǒng)一中位數(shù)算法,我們可以將奇數(shù)條數(shù)的中位數(shù)也看成有兩個(gè),也就是兩條處于4位置的記錄。這樣的話,我們就都可以用兩條記錄的平均數(shù)來計(jì)算中位數(shù)了。為了求出位置一,我們利用了Access中邏輯值的特性(0,-1),這是一個(gè)常用的奇巧的算法。由此我們?yōu)榻鉀Q中位數(shù)計(jì)算的第一個(gè)難題做好了準(zhǔn)備。
關(guān)于第二個(gè)難題是計(jì)算效率問題,中位數(shù)的處理我們可以有多種方法。其中比較容易想到的是在字段上編寫子查詢或用域函數(shù),但這樣的處理運(yùn)算速度非常慢。比較好的處理時(shí)采用聯(lián)接的方式編寫。由此我們可以編寫“中位數(shù)查詢”,在這個(gè)查詢中,我們用一個(gè)分組查詢與兩個(gè)“編號(hào)查詢”聯(lián)接,這樣就得到了計(jì)算中位數(shù)的兩個(gè)值,將這兩個(gè)值平均一下,也就得到了對應(yīng)的中位數(shù)了。
另外一個(gè)關(guān)于聯(lián)接的問題也有點(diǎn)意思。有一個(gè)版友給了這樣一組數(shù)據(jù):
縣市 鄉(xiāng)鎮(zhèn)
衡陽縣 湖南張家界市
臨湘市 湖南省岳陽地區(qū)岳陽市
湘潭縣 湖南衡陽縣西渡鎮(zhèn)
岳陽市 中國湖南湘潭縣易俗河鎮(zhèn)
其希望處理后得到如下結(jié)果:
縣市 鄉(xiāng)鎮(zhèn)
岳陽市 湖南省岳陽地區(qū)岳陽市
衡陽縣 湖南衡陽縣西渡鎮(zhèn)
湘潭縣 中國湖南湘潭縣易俗河鎮(zhèn)
這個(gè)問題看起來復(fù)雜,其實(shí)如果用聯(lián)接的方式處理也十分簡單,這個(gè)查詢中的關(guān)鍵部分在于ON子句的寫法,這個(gè)寫法采用的是邏輯表達(dá)式,而不是關(guān)系表達(dá)式。關(guān)于這個(gè)問題,可以參見《三層功夫》中的論述。
示例:
視圖:
|
本帖子中包含更多資源
您需要 登錄 才可以下載或查看,沒有帳號(hào)?注冊
x
|