Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql ROW_NUMBER()覆盖(分区依据…)以返回特定行_Sql_Oracle_Window Functions_Row Number - Fatal编程技术网

Sql ROW_NUMBER()覆盖(分区依据…)以返回特定行

Sql ROW_NUMBER()覆盖(分区依据…)以返回特定行,sql,oracle,window-functions,row-number,Sql,Oracle,Window Functions,Row Number,我的查询如下所示: 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 (

我的查询如下所示:

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'
因此,我正在尝试提取未取消的最新订单。基本上我的行数超过了分区数。。。函数按顺序标记订单,1表示最近的订单,2表示第二个最近的订单。问题是,通过这个查询,它同时提取最近和第二个最近的订单。我试着把它写在哪里,如果它只给出一个或另一个。因此,如果COUNT=1且订单类型不是cancel,则只显示该记录。如果没有,那么给我看第二个

非常感谢你事先的帮助。这是在Toad for Oracle 9.5中使用SQL选项卡完成的。

但是您有一个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'

使用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返回一个整数,因此请不要将该列与字符串

输入/输出进行比较。将订单类型“Cancel”添加到cte,然后在第二个查询中仅查找Count='1'。试试看。我只是在读你的评论之前就在想。好主意!让我核对一下,然后标上答案