2015-07-13 35 views
0

我有一個表,如下所示:如何從每個組中選擇底部的N行 - 的Oracle 11g

 
+-----------------+----------+-------------+-------------+ 
| QCD_OUTLET_CODE | QCD_YEAR | QCD_QUARTER | QCD_CREDITS | 
+-----------------+----------+-------------+-------------+ 
|  144034911 |  2015 | Q2   | 269.5  | 
|  10500106 |  2015 | Q2   | 303.35  | 
|  144034911 |  2015 | Q1   | 231.85  | 
|  10500106 |  2015 | Q1   | 250.4  | 
|  10500106 |  2014 | Q4   | 276.5  | 
|  144034911 |  2014 | Q4   | 224.5  | 
+-----------------+----------+-------------+-------------+ 

我需要顯示底部2行通過QCD_YEARQCD_QUARTER排序,使得最新季度贏得最後的排名(顯示爲最後一排爲每個組) 以前,當有隻2014/Q42015/Q1(即,兩個記錄每QCD_OUTLET_CODE),下面的查詢工作正常顯示的順序祝記錄:

WITH ordered 
    AS (SELECT qcd_outlet_code, 
       qcd_year, 
       qcd_quarter, 
       qcd_credit, 
       Row_number() 
        over ( 
        PARTITION BY qcd_outlet_code 
        ORDER BY qcd_outlet_code, qcd_year, qcd_quarter) 
       AS rn 
     FROM QTR_CREDIT_DATA) 
SELECT d.qcd_outlet_code AS "Outlet_Code:string", 
     d.qcd_quarter 
     ||' ' 
     ||d.qcd_year   AS "MCT_quarter:string", 
     Nvl(d.qcd_credit, 0) AS "MCT_Total_Credits_Earned", 
     d.rn     AS "Display_Order:string" 
FROM ordered d 
WHERE rn <= 2; 

爲兩排,每QCD_OUTLET_CODE結果:

 
+--------------------+--------------------+--------------------------+----------------------+ 
| Outlet_Code:string | MCT_quarter:string | MCT_Total_Crecits_Earned | Display_Order:string | 
+--------------------+--------------------+--------------------------+----------------------+ 
|   10500106 | Q4 2014   | 387      |     1 | 
|   10500106 | Q1 2015   | 482.75     |     2 | 
|   144034911 | Q4 2014   | 269.5     |     1 | 
|   144034911 | Q1 2015   | 276.5     |     2 | 
+--------------------+--------------------+--------------------------+----------------------+ 

請忽略QCD_QUARTER的數字,它們是任意的。

所以Display_Order:string將顯示1和2 但是,通過附加行用於每個QCD_OUTLET_CODE我需要還顯示每組底部2行(即,2015/Q12015/Q2),我需要它們的具有值1和2 for Display_Order:string

運行上述相同的腳本將返回上述相同的結果(2014/Q42015/Q1)。 如果我在Partition子句中使用DESC,它將返回我想要的行,但Display_Order:string將不會有正確的值('2015/Q2'將給1而不是2)。

我從第一數據集我張貼以上如下希望其結果是:

 
+--------------------+--------------------+--------------------------+----------------------+ 
| Outlet_Code:string | MCT_quarter:string | MCT_Total_Crecits_Earned | Display_Order:string | 
+--------------------+--------------------+--------------------------+----------------------+ 
|   10500106 | Q1 2015   | 387      |     1 | 
|   10500106 | Q2 2015   | 482.75     |     2 | 
|   144034911 | Q1 2015   | 269.5     |     1 | 
|   144034911 | Q2 2015   | 276.5     |     2 | 
+--------------------+--------------------+--------------------------+----------------------+ 

對於它的價值,我試圖實現邏輯就像滑過每一組來顯示一個窗口最新的兩個季度,並相應地給出行數。

+0

使用'DESC'()(PARTITION BY qcd_outlet_code ORDER BY qcd_outlet_code,qcd_year DESC,qcd_quarter DESC)')。 –

+0

@ shA.t這是一個超級快速的答案。如果你的意思是我提到我的問題(通過desc分區順序),它沒有返回我想要的正確的row_number。它給1到最後一個季度,而我想它給2最新的,1到第一個 – Hawk

+0

@Hawk把'DESC'放在'ORDER BY'子句中,不進行分區並讓我們知道輸出。請記住,只有在指定ORDER BY時才能保證** ORDER **。要獲得相反的順序,您必須使用DESC。 –

回答

1

試試這個:在`ROW_NUMBER超過

WITH ordered 
    AS (SELECT qcd_outlet_code, 
       qcd_year, 
       qcd_quarter, 
       qcd_credit, 
       Row_number() 
        over ( 
        PARTITION BY qcd_outlet_code 
        ORDER BY qcd_outlet_code, qcd_year DESC, qcd_quarter DESC) 
       AS rn 
     FROM QTR_CREDIT_DATA) 
SELECT d.qcd_outlet_code AS "Outlet_Code:string", 
     d.qcd_quarter 
     ||' ' 
     ||d.qcd_year   AS "MCT_quarter:string", 
     Nvl(d.qcd_credit, 0) AS "MCT_Total_Credits_Earned", 
     Row_number() 
        over ( 
        PARTITION BY qcd_outlet_code 
        ORDER BY qcd_outlet_code, qcd_year, qcd_quarter) 
          AS "Display_Order:string" 
FROM ordered d 
WHERE rn <= 2; 
+0

將'over partition'添加到主查詢中,以及將'desc'添加到CTE分區子句中也有訣竅。非常感謝 – Hawk