我有一個表,如下所示:如何從每個組中選擇底部的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_YEAR
和QCD_QUARTER
排序,使得最新季度贏得最後的排名(顯示爲最後一排爲每個組) 以前,當有隻2014/Q4
和2015/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/Q1
和2015/Q2
),我需要它們的具有值1和2 for Display_Order:string
運行上述相同的腳本將返回上述相同的結果(2014/Q4
和2015/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 | +--------------------+--------------------+--------------------------+----------------------+
對於它的價值,我試圖實現邏輯就像滑過每一組來顯示一個窗口最新的兩個季度,並相應地給出行數。
使用'DESC'()(PARTITION BY qcd_outlet_code ORDER BY qcd_outlet_code,qcd_year DESC,qcd_quarter DESC)')。 –
@ shA.t這是一個超級快速的答案。如果你的意思是我提到我的問題(通過desc分區順序),它沒有返回我想要的正確的row_number。它給1到最後一個季度,而我想它給2最新的,1到第一個 – Hawk
@Hawk把'DESC'放在'ORDER BY'子句中,不進行分區並讓我們知道輸出。請記住,只有在指定ORDER BY時才能保證** ORDER **。要獲得相反的順序,您必須使用DESC。 –