2014-09-29 4 views
0

Мой запрос выглядит следующим образом:ROW_NUMBER() над (Partition по ....) для возврата конкретной строки

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 не отменяется, покажите мне только эту запись. Если нет, тогда покажи мне второе.

Большое спасибо за помощь заранее. Это делается в Toad для Oracle 9.5 с использованием вкладки SQL.

+0

Input/Output, пожалуйста. – zaratustra

+0

Добавьте «Order_Type» <> «Отменить» на cte, а затем посмотрите только «Count» = '1' во втором запросе. Попробуй это. – websch01ar

+0

Websch01ar. Я просто подумал, что прямо перед тем, как я прочитаю ваш комментарий. Отличная идея! Позвольте мне проверить, а затем отметить как ответ – user3486773

ответ

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 "COUNT" 
From Orders_Table 
where "Order_Type" <> 'Cancel') 

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

Используйте выражение случая, чтобы контролировать, какие строки получить результат от 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() возвращает целое число, так что не сравнить этот столбец в строку