Dict.CN 在線詞典, 英語學習, 在線翻譯

          都市淘沙者

          荔枝FM Everyone can be host

          統計

          留言簿(23)

          積分與排名

          優秀學習網站

          友情連接

          閱讀排行榜

          評論排行榜

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

          與SQL SERVER相比,Oracle沒有Top n 這樣簡單方便取前幾名的方法.
                 但也有相對應的方法可以實現,使用的是Oracle中的偽列:rownum.

                 最簡單的方法如下:

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

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

          三:變態一點的:取前幾名,但值相同的記錄為同一名次
                  比如:對班級學生成績進行排名,第一名:100,共2名,第二名,98,共5名........如此類推,取出排名前十名的所有學生。
                  基本思路是:先使用Distinct取得成績的前十名,并使用rownum排序.這樣可以得出第十名的值,然后取所有成績大于等于第十名的所有學生信息。
                  記錄得到后,然后再與剛使用Distinct取得成績為前十名,且有rownum序號的表Join,以成績為條件。就可以得到正常的排名次序。
                   相關代碼請參考如下腳本:
          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  --得到正確的排名序號
                        
          -----以下條件是取得所有大于第十名成績的記錄              
           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) 評論(0)  編輯  收藏 所屬分類: Oracle/Mysql/Postgres/

          主站蜘蛛池模板: 宽城| 宾川县| 老河口市| 冀州市| 河东区| 中西区| 平阴县| 门源| 沽源县| 项城市| 望城县| 呈贡县| 工布江达县| 什邡市| 惠水县| 通海县| 驻马店市| 定安县| 界首市| 双城市| 鹤庆县| 濮阳市| 永吉县| 西畴县| 杨浦区| 宾川县| 泰宁县| 陆良县| 四平市| 阳春市| 志丹县| 双峰县| 嵊州市| 公安县| 府谷县| 井陉县| 将乐县| 岳阳县| 临湘市| 神农架林区| 盘山县|