2014-09-29 90 views
0

我的查詢看起來是這樣的:ROW_NUMBER()OVER(由....分區)返回特定行

with T1 as (
Select 
Dept_No, 
Product_No, 
Order_No, 
Order_Type 
Row_number() over (partition by Product_ID order by Order_No desc) as "COUNT" 

From Orders_Table) 

Select * from T1 
where ("COUNT" = '1' and "Order_Type" <> 'Cancel') 
or ("COUNT" = '2' AND "Order_Type" <> 'Cancel' 

所以我想拉,這不是取消了最近的訂單。本質上,我的ROW_number()over(partition by ...)函數按順序標記訂單,其中1是最近的訂單,2是最近的第二個訂單。問題在於,通過此查詢,它會同時提取最近的和最近的第二個訂單。我正試圖把它寫到哪裏,如果它只給出一個或另一個。所以如果COUNT = 1並且order_type不是取消,那麼只顯示那條記錄。如果沒有,然後告訴我第二。

非常感謝您的幫助。這是使用SQL選項卡在Toad for Oracle 9.5中完成的。

+0

輸入/輸出,請。 – zaratustra 2014-09-29 14:22:20

+0

將「Order_Type」<>'Cancel'添加到cte,然後僅在第二個查詢中查找「Count」='1'。試試看。 – websch01ar 2014-09-29 14:25:33

+0

Websch01ar。在閱讀你的評論之前,我只是在想。好想法!讓我檢查一下,然後標記爲答案 – user3486773 2014-09-29 14:46:53

回答

1

但你有一個or。
如果兩者都滿意,你會得到兩行。

with T1 as (
Select 
Dept_No, 
Product_No, 
Order_No, 
Order_Type 
Row_number() over (partition by Product_ID order by Order_No desc) as "COUNT" 
From Orders_Table 
where "Order_Type" <> 'Cancel') 

Select * from T1 
where "COUNT" = '1' 
0

使用CASE表達式來控制該行得到ROW_NUMBER(結果),在這裏我們要避免的編號已經取消的任何行:

WITH t1 AS (
     SELECT 
      Dept_No 
      , Product_No 
      , Order_No 
      , Order_Type 
      /* the most recent order that was not canceled */ 
      , case when order_type <> 'Cancel' 
       then ROW_NUMBER() OVER (PARTITION BY Product_ID 
              ORDER BY Order_No DESC) 
       end AS is_recent 
     FROM Orders_Table 
    ) 
SELECT 
     * 
FROM t1 
WHERE is_recent = 1 

或者,也許最簡單的方法是簡單地排除取消訂單,例如

WITH t1 AS (
     SELECT 
      Dept_No 
      , Product_No 
      , Order_No 
      , Order_Type 
      , ROW_NUMBER() OVER (PARTITION BY Product_ID 
              ORDER BY Order_No DESC) 
       AS is_recent 
     FROM Orders_Table 
     WHERE order_type <> 'Cancel' 
    ) 
SELECT 
     * 
FROM t1 
WHERE is_recent = 1 

注意:ROW_NUMBER()返回一個整數,所以不要在列與字符串

相關問題