Dict.CN 在線詞典, 英語(yǔ)學(xué)習(xí), 在線翻譯

          都市淘沙者

          荔枝FM Everyone can be host

          統(tǒng)計(jì)

          留言簿(23)

          積分與排名

          優(yōu)秀學(xué)習(xí)網(wǎng)站

          友情連接

          閱讀排行榜

          評(píng)論排行榜

          Oracle中取前幾名的方法(轉(zhuǎn))

          與SQL SERVER相比,Oracle沒有Top n 這樣簡(jiǎn)單方便取前幾名的方法.
                 但也有相對(duì)應(yīng)的方法可以實(shí)現(xiàn),使用的是Oracle中的偽列:rownum.

                 最簡(jiǎn)單的方法如下:

          一:最簡(jiǎn)單的問題:直接取前幾名
                  SELECT A.* from Company_Expense  A WHERE ROWNUM<=N 
                   (注意,在上句中我們沒有指定按哪列進(jìn)行排序,而具體rownum序號(hào)是依據(jù)哪一列,現(xiàn)在我都不確定。但可以明確一點(diǎn)的是,如果我們按主鍵進(jìn)行排序,rownum號(hào)不會(huì)亂,但如果指定其它列的號(hào),序號(hào)有可能會(huì)亂)       

          二:麻煩一點(diǎn)的:取后幾名
                  上面方法的一點(diǎn)變通,首先在內(nèi)部以某列進(jìn)行排列,在外面取
                  select V.* from
          (
          select rownum,A.* from company_expense A
          order by a.expenseid desc
          )V where rownum<3

          三:變態(tài)一點(diǎn)的:取前幾名,但值相同的記錄為同一名次
                  比如:對(duì)班級(jí)學(xué)生成績(jī)進(jìn)行排名,第一名:100,共2名,第二名,98,共5名........如此類推,取出排名前十名的所有學(xué)生。
                  基本思路是:先使用Distinct取得成績(jī)的前十名,并使用rownum排序.這樣可以得出第十名的值,然后取所有成績(jī)大于等于第十名的所有學(xué)生信息。
                  記錄得到后,然后再與剛使用Distinct取得成績(jī)?yōu)榍笆矣衦ownum序號(hào)的表Join,以成績(jī)?yōu)闂l件。就可以得到正常的排名次序。
                   相關(guān)代碼請(qǐng)參考如下腳本:
          select rownum, T.Row_Num, v.*
            from (select A.Name,
                         A.Employee_Code,
                         v.STATUS,
                         To_Char(v.JOIN_DATE, 'yyyy-mm-dd') Join_Date,
                         V.Unit_Name,
                         p.line_description Line_Num,
                         sum(a.last_result) Sum_result
                    from QM_QUALITY_LEVEL_JUDGE   A,
                         hr_lbr_employee_tl_tbl_v v,
                         Qm_Product_Line          P
                   Where a.employee_code = v.EMPLOYEE_CODE
                     And A.LINE_NUM = P.Line_Num
                     And To_Char(A.Index_Date, 'yyyy-mm-dd') >= '2006-05-01'
                     And To_Char(A.Index_Date, 'yyyy-mm-dd') <= '2006-07-24'
                     And A.Last_Result > 0
                   group by A.Name,
                            A.Employee_Code,
                            V.STATUS,
                            V.JOIN_DATE,
                            V.Unit_Name,
                            A.Line_Num,
                            P.LINE_DESCRIPTION
                   order by Sum_Result desc, employee_code desc) v   ---基本的信息
            left join (select rownum row_Num, v.*
                         from (select distinct sum(a.last_result) Sum_result
                                 from QM_QUALITY_LEVEL_JUDGE   A,
                                      hr_lbr_employee_tl_tbl_v v,
                                      Qm_Product_Line          P
                                Where a.employee_code = v.EMPLOYEE_CODE
                                  And A.LINE_NUM = P.Line_Num
                                  And To_Char(A.Index_Date, 'yyyy-mm-dd') >=
                                      '2006-05-01'
                                  And To_Char(A.Index_Date, 'yyyy-mm-dd') <=
                                      '2006-07-24'
                                  And A.Last_Result > 0
                                group by A.Name,
                                         A.Employee_Code,
                                         V.STATUS,
                                         V.JOIN_DATE,
                                         V.Unit_Name,
                                         A.Line_Num,
                                         P.LINE_DESCRIPTION
                                Order by Sum_Result Desc) v
                        Where rownum <= 10) T On v.Sum_Result = T.Sum_Result  --得到正確的排名序號(hào)
                        
          -----以下條件是取得所有大于第十名成績(jī)的記錄              
           where V.sum_Result >=
                 (select min(Sum_Result) Sum_Result
                    from (select rownum row_Num, v.*
                            from (select distinct sum(a.last_result) Sum_result
                                    from QM_QUALITY_LEVEL_JUDGE   A,
                                         hr_lbr_employee_tl_tbl_v v,
                                         Qm_Product_Line          P
                                   Where a.employee_code = v.EMPLOYEE_CODE
                                     And A.LINE_NUM = P.Line_Num
                                     And To_Char(A.Index_Date, 'yyyy-mm-dd') >=
                                         '2006-05-01'
                                     And To_Char(A.Index_Date, 'yyyy-mm-dd') <=
                                         '2006-07-24'
                                     And A.Last_Result > 0
                                   group by A.Name,
                                            A.Employee_Code,
                                            V.STATUS,
                                            V.JOIN_DATE,
                                            V.Unit_Name,
                                            A.Line_Num,
                                            P.LINE_DESCRIPTION
                                   Order By Sum_Result Desc) v
                           Where rownum <= 10))


          posted on 2007-10-16 16:28 都市淘沙者 閱讀(2874) 評(píng)論(0)  編輯  收藏 所屬分類: Oracle/Mysql/Postgres/

          主站蜘蛛池模板: 祁连县| 灵山县| 博罗县| 滁州市| 潞西市| 乐都县| 建阳市| 南皮县| 扎赉特旗| 崇阳县| 镇沅| 扬州市| 舞阳县| 五指山市| 黄浦区| 新疆| 山东| 祁东县| 万州区| 平武县| 常德市| 阳春市| 犍为县| 阜阳市| 沧州市| 武宣县| 会东县| 长岛县| 夏河县| 雅安市| 莆田市| 会泽县| 绍兴市| 思茅市| 桐庐县| 九江县| 冕宁县| 保亭| 建湖县| 太和县| 沂南县|