欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
用ORACLE分析函數實(shí)現行列轉換

用ORACLE分析函數實(shí)現行列轉換

黃莉  玉素甫·艾白都拉
(新疆師范大學(xué) 數理信息學(xué)院,新疆 830054)
 
    摘  要 對數據庫中的數據用SQL實(shí)現行列轉換,不但需要編寫(xiě)復雜的程序代碼,還需要編寫(xiě)存儲過(guò)程。若引入ORACLE中的分析函數則會(huì )使該過(guò)程簡(jiǎn)便很多。首先找出表中所有關(guān)鍵字的屬性個(gè)數的最大值,設為n,其次為每個(gè)關(guān)鍵字新添加n列,并用分析函數查詢(xún)關(guān)鍵字的屬性所處列的位置,然后將每個(gè)關(guān)鍵字的多行屬性轉換成多列屬性,最后把生成的多個(gè)新列拼成一個(gè)串形成一列,從而實(shí)現行列轉換。
    關(guān)鍵字 Oracle數據庫;分析函數;行列轉換
 

1 引言

    分析函數的設計目的是為了解決諸如“累計計算”等問(wèn)題。雖然大部分的問(wèn)題都可以用PL/SQL解決,但是性能并不理想,首先查詢(xún)本身并不容易編寫(xiě),其次有些很難在SQL中直接做的查詢(xún)但實(shí)際上是很普通的操作,比如實(shí)現數據表中行列傳換。這樣的問(wèn)題在SQL中做查詢(xún)就很困難。在分析函數出現以前,我們必須使用自聯(lián)查詢(xún)或者子查詢(xún)甚至復雜的存儲過(guò)程實(shí)現的語(yǔ)句,現在只要一條簡(jiǎn)單的SQL語(yǔ)句就可以實(shí)現了,而且在執行效率方面也有相當大的提高。本文將以一個(gè)實(shí)例來(lái)描述如何采用分析函數實(shí)現數據中的行列互換。

2 原理

2.1 分析函數的格式及語(yǔ)法

    分析函數是在一個(gè)記錄行分組的基礎上計算它們的總值。行的分組被稱(chēng)窗口,并通過(guò)分析語(yǔ)句定義。對于每記錄行,定義了一個(gè)“滑動(dòng)”窗口。該窗口確定“當前行”計算的范圍。窗口的大小可由各行的實(shí)際編號或由時(shí)間等邏輯間隔確定。
    分析函數以如下形式開(kāi)頭:
Analytic-Function(<Argument>,<Argument>,...)
OVER (<Query-Partition-Clause><Order-By-Clause><Windowing-Clause>)
    (1)Analytic-Function:分析函數的名稱(chēng),Oracle10gR2帶的內置分析函數有多個(gè),包括:AVG、CORR、COVAR_POP、COVAR_SAMP、COUNT、LAG、LAST、LEAD、MAX、MIN、RANK、SUM等;對于用戶(hù)自定義的分析函數,分析函數名稱(chēng)需要滿(mǎn)足標識符規則。
    (2)Arguments:參數,分析函數通常有0到3個(gè)參數,參數可以是任何數字類(lèi)型或是可以隱式轉換為數字類(lèi)型的數據類(lèi)型。對于用戶(hù)自定義的參數,可以根據實(shí)際情況使用。
    (3)OVER:是分析函數就必須使用的關(guān)鍵字,對于既可作為聚集函數又可作為分析函數的函數,Oracle無(wú)法識別,必須用over來(lái)標識此函數為分析函數。
    (4)Query-Partition-Clause:查詢(xún)分組子句,根據劃分表達式設置的規則,PARTITION BY將一個(gè)結果邏輯分成N個(gè)分組劃分表達式。分析函數獨立應用于各個(gè)分組,并在應用時(shí)重置。
    (5)Order-By-Clause:(按…排序分組),是排序子句,根據一個(gè)或多個(gè)排序表達式對分組進(jìn)行排序。
    (6)Windowing-Clause窗口生成語(yǔ)句:窗口生成語(yǔ)句用以定義滑動(dòng)或固定數據窗口,分析函數在分組內進(jìn)行分析。該語(yǔ)句能夠對分組中任意定義的滑動(dòng)或固定窗口進(jìn)行計算。

2.2 實(shí)例原理介紹

    本實(shí)例是將具有相同關(guān)鍵字的多條記錄中的某一不同列合并成一列,例如在一個(gè)臨時(shí)表中包含有用戶(hù)的編號、電話(huà)號碼、產(chǎn)品名稱(chēng)、所在營(yíng)業(yè)區以及相關(guān)業(yè)務(wù)名稱(chēng)5個(gè)字段,而每個(gè)用戶(hù)的業(yè)務(wù)可能有多項,這樣創(chuàng )建數據表將會(huì )造成冗余,現在要想辦法將表中編號、電話(huà)號碼、產(chǎn)品名稱(chēng)、所在營(yíng)業(yè)區四個(gè)字段相同的用戶(hù)的相關(guān)業(yè)務(wù)屬性合并成一列解決冗余問(wèn)題,使用SQL語(yǔ)句會(huì )比較困難,甚至需要一定的存儲過(guò)程。使用Orcale中的分析函數來(lái)實(shí)現這樣的行列轉換就比較簡(jiǎn)單方便了。

3 實(shí)例

    1)創(chuàng )建臨時(shí)表
Drop Table temp;
Create Table temp

num varchar2(15 Char),
name varchar2(20 Char),
sex varchar2(2 Char),
classes varchar2(30 Char),
course_name varchar2(50 Char)
);
    2)構造數據
insert   into    temp(num,name,sex,classes,course_name)  values ('206211','王藝','男','06-1班','保險學(xué)');
insert into temp(num,name,sex,classes,course_name) values ('206212','肖薇','女','06-2','保險學(xué)');
insert into temp(num,name,sex,classes,course_name) values ('206212','肖薇','女','06-2','財務(wù)管理');
insert into temp(num,name,sex,classes,course_name) values ('206212','肖薇','女','06-2','財務(wù)會(huì )計');
insert into temp(num,name,sex,classes,course_name) values ('206213','陳雅詩(shī)','女','06-2','電子商務(wù)');
insert into temp(num,name,sex,classes,course_name) values ('206213','陳雅詩(shī)','女','06-2','公共經(jīng)濟學(xué)');
insert into temp(num,name,sex,classes,course_name) values ('206213','陳雅詩(shī)','女','06-2','公司理財');
insert into temp(num,name,sex,classes,course_name) values ('206213','陳雅詩(shī)','女','06-2','管理學(xué)原理');
insert into temp(num,name,sex,classes,course_name) values ('206213','陳雅詩(shī)','女','06-2','保險學(xué)');
insert into temp(num,name,sex,classes,course_name) values ('206214','李丹陽(yáng)','男','06-1','保險學(xué)');
insert into temp(num,name,sex,classes,course_name) values ('206214','李丹陽(yáng)','男','06-1','財務(wù)管理');
insert into temp(num,name,sex,classes,course_name) values ('206214','李丹陽(yáng)','男','06-1','財務(wù)會(huì )計');
insert into temp(num,name,sex,classes,course_name) values ('206214','李丹陽(yáng)','男','06-1','電子商務(wù)');
insert into temp(num,name,sex,classes,course_name) values ('206214','李丹陽(yáng)','男','06-1','公共經(jīng)濟學(xué)');
insert into temp(num,name,sex,classes,course_name) values ('206215','楊伊琳','女','06-3班','環(huán)境管理學(xué)');
insert into temp(num,name,sex,classes,course_name) values ('206215','楊伊琳','女','06-3班','管理學(xué)原理');
insert into temp(num,name,sex,classes,course_name) values ('206215','楊伊琳','女','06-3班','商務(wù)談判');
insert into temp(num,name,sex,classes,course_name) values ('206216','李佳琪','男','06-2','土地估計');
Commit;
    3)先查一下course_name最多的組合
select max(count(course_name))
from   temp
group  by num,name,sex,classes;
    4) 列的位置
用分析函數中的row_number函數,在num,name,sex,classes相同的情況下course_name所處的列的位置(第幾列)。
row_number函數解釋?zhuān)悍祷赜行蚪M中一行的偏移量,從而可用于按特定標準排序的行號。
select num,name,sex,classes,course_name,
row_number() over(partition by num,name,sex,classes order by course_name) rn
from   temp;
    5)把course_name的所有的行換成列
select num,name,sex,classes,
            max(decode(rn,1,course_name,null)) course_name_1,
            max(decode(rn,2,course_name,null)) course_name_2,
            max(decode(rn,3,course_name,null)) course_name_3,
            max(decode(rn,4,course_name,null)) course_name_4,
            max(decode(rn,5,course_name,null)) course_name_5
from   (select num,name,sex,classes,course_name,
row_number() over(partition by num,name,sex,classes order by course_name) rn
                   from   temp)
group  by num,name,sex,classes;
    列的位置參見(jiàn)圖1。
圖1
    6)把轉換后的name拼成一個(gè)字符串,放在一行
select num,name,sex,classes,
  (max(decode(rn,1,course_name,null)) || max(decode(rn,2,',' || course_name,null)) || max(decode(rn,3,',' || course_name,null)) || max(decode(rn,4,',' || course_name,null)) ||
            max(decode(rn,5,',' || course_name,null))) name
from   (select num,name,sex,classes,course_name,
                   row_number() over(partition by num,name,sex,classes order by course_name) rn
                   from   temp)
group  by num,name,sex,classes;
  結果如圖2所示。


圖2

4 總結

    本文中的程序能夠實(shí)現以下功能:①計算具有相同關(guān)鍵字的最多的組合;②根據分析函數查詢(xún)某一關(guān)鍵字所處的列的位置;③把需合并列的所有的行換成列;④把需要合并的某幾列拼成一個(gè)串。
分析函數除了擁有以上所介紹的功能,還能夠實(shí)現諸如求和、Top-N查詢(xún)、統計某個(gè)范圍的數據行窗口、交叉表查詢(xún)等功能。

參考文獻

    [1](美)Thomas Kyte 袁勤勇,張玉魁譯 Oracle專(zhuān)家高級編程-Expert_one-on-one_Oracle 清華大學(xué)出版社2002
    [2](美)Thomas Kyte   Expert Oracle Database Architecture 9i and 10g Programming Teachniques and Solutions  清華大學(xué)出版社2002
    [3] 任樹(shù)華 Oracle 10g應用指導與案例精講 機械工業(yè)出版社
    [4] Oracle分析函數使用方法
http://www.zxbc.cn/html/Oracle/1713270622601.html
    [5] Oracle分析函數學(xué)習筆記
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
SQL Server SQL高級查詢(xún)語(yǔ)句小結
學(xué)生成績(jì)管理系統(C語(yǔ)言)
利用 Pandas 進(jìn)行分類(lèi)數據編碼的10種方式
c語(yǔ)言結構體和共用體1.有5個(gè)學(xué)生,每個(gè)學(xué)生的數據包括學(xué)號、姓名、3門(mén)課的成績(jì),從鍵盤(pán)輸入5個(gè)學(xué)生數據
編程中國
C語(yǔ)言中結構體詳解
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久