乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      用ORACLE分析函數(shù)實(shí)現(xiàn)行列轉(zhuǎn)換

       笑晨風(fēng) 2010-12-29

      用ORACLE分析函數(shù)實(shí)現(xiàn)行列轉(zhuǎn)換

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

      1 引言

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

      2 原理

      2.1 分析函數(shù)的格式及語法

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

      2.2 實(shí)例原理介紹

          本實(shí)例是將具有相同關(guān)鍵字的多條記錄中的某一不同列合并成一列,例如在一個(gè)臨時(shí)表中包含有用戶的編號(hào)、電話號(hào)碼、產(chǎn)品名稱、所在營業(yè)區(qū)以及相關(guān)業(yè)務(wù)名稱5個(gè)字段,而每個(gè)用戶的業(yè)務(wù)可能有多項(xiàng),這樣創(chuàng)建數(shù)據(jù)表將會(huì)造成冗余,現(xiàn)在要想辦法將表中編號(hào)、電話號(hào)碼、產(chǎn)品名稱、所在營業(yè)區(qū)四個(gè)字段相同的用戶的相關(guān)業(yè)務(wù)屬性合并成一列解決冗余問題,使用SQL語句會(huì)比較困難,甚至需要一定的存儲(chǔ)過程。使用Orcale中的分析函數(shù)來實(shí)現(xiàn)這樣的行列轉(zhuǎ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)構(gòu)造數(shù)據(jù)
      insert   into    temp(num,name,sex,classes,course_name)  values ('206211','王藝','男','06-1班','保險(xiǎn)學(xué)');
      insert into temp(num,name,sex,classes,course_name) values ('206212','肖薇','女','06-2','保險(xiǎn)學(xué)');
      insert into temp(num,name,sex,classes,course_name) values ('206212','肖薇','女','06-2','財(cái)務(wù)管理');
      insert into temp(num,name,sex,classes,course_name) values ('206212','肖薇','女','06-2','財(cái)務(wù)會(huì)計(jì)');
      insert into temp(num,name,sex,classes,course_name) values ('206213','陳雅詩','女','06-2','電子商務(wù)');
      insert into temp(num,name,sex,classes,course_name) values ('206213','陳雅詩','女','06-2','公共經(jīng)濟(jì)學(xué)');
      insert into temp(num,name,sex,classes,course_name) values ('206213','陳雅詩','女','06-2','公司理財(cái)');
      insert into temp(num,name,sex,classes,course_name) values ('206213','陳雅詩','女','06-2','管理學(xué)原理');
      insert into temp(num,name,sex,classes,course_name) values ('206213','陳雅詩','女','06-2','保險(xiǎn)學(xué)');
      insert into temp(num,name,sex,classes,course_name) values ('206214','李丹陽','男','06-1','保險(xiǎn)學(xué)');
      insert into temp(num,name,sex,classes,course_name) values ('206214','李丹陽','男','06-1','財(cái)務(wù)管理');
      insert into temp(num,name,sex,classes,course_name) values ('206214','李丹陽','男','06-1','財(cái)務(wù)會(huì)計(jì)');
      insert into temp(num,name,sex,classes,course_name) values ('206214','李丹陽','男','06-1','電子商務(wù)');
      insert into temp(num,name,sex,classes,course_name) values ('206214','李丹陽','男','06-1','公共經(jīng)濟(jì)學(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','土地估計(jì)');
      Commit;
          3)先查一下course_name最多的組合
      select max(count(course_name))
      from   temp
      group  by num,name,sex,classes;
          4) 列的位置
      用分析函數(shù)中的row_number函數(shù),在num,name,sex,classes相同的情況下course_name所處的列的位置(第幾列)。
      row_number函數(shù)解釋:返回有序組中一行的偏移量,從而可用于按特定標(biāo)準(zhǔn)排序的行號(hào)。
      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;
          列的位置參見圖1。
      圖1
          6)把轉(zhuǎn)換后的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;
        結(jié)果如圖2所示。


      圖2

      4 總結(jié)

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

      參考文獻(xiàn)

          [1](美)Thomas Kyte 袁勤勇,張玉魁譯 Oracle專家高級編程-Expert_one-on-one_Oracle 清華大學(xué)出版社2002
          [2](美)Thomas Kyte   Expert Oracle Database Architecture 9i and 10g Programming Teachniques and Solutions  清華大學(xué)出版社2002
          [3] 任樹華 Oracle 10g應(yīng)用指導(dǎo)與案例精講 機(jī)械工業(yè)出版社
          [4] Oracle分析函數(shù)使用方法
      http://www.zxbc.cn/html/Oracle/1713270622601.html
          [5] Oracle分析函數(shù)學(xué)習(xí)筆記

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多