Sql 分区覆盖的附加条件

Sql 分区覆盖的附加条件,sql,select,Sql,Select,我这里的问题是,我希望函数分区只从某个时间范围开始计算行数 在这个例子中,如果我在末尾添加rn=1,那么order\u id=5将被排除在结果之外(因为分区是按paid\u date排序的,并且有order\u id=6的较早日期),但它不应该是我希望分区的时间范围从'2019-01-10'开始的 添加条件rn=1预期输出应该是order\u id 3,5,11,15,现在它唯一的3,11,15 它应该只包括在给定时间范围内第一个已付款的订单(如果之前有已付款=1的订单,则不应计算) 如果应该

我这里的问题是,我希望函数分区只从某个时间范围开始计算行数

在这个例子中,如果我在末尾添加
rn=1
,那么order\u id=5将被排除在结果之外(因为分区是按
paid\u date
排序的,并且有
order\u id=6
的较早日期),但它不应该是我希望分区的时间范围从
'2019-01-10'
开始的

添加条件
rn=1
预期输出应该是
order\u id 3,5,11,15
,现在它唯一的
3,11,15

  • 它应该只包括在给定时间范围内第一个已付款的
    订单(如果之前有
    已付款=1
    的订单,则不应计算)

如果应该优先考虑订单id,那么在分区函数order by子句中,将其置于支付日期之前,这将解决您的问题

SELECT order_id, customer_id, amount, is_paid, paid_date,  rn FROM (
            SELECT o.*, 
                ROW_NUMBER() OVER(PARTITION BY customer_id ORDER BY  order_id,paid_date) rn
            FROM orders o
        ) x WHERE is_paid = 0 and paid_date between 
        '2019-01-10' and '2019-01-15' and rn=1
由于您需要首先对支付日期进行排序,因此需要在分区表中暗示where条件,以避免不必要的日期中断分区函数

SELECT order_id, customer_id, amount, is_paid, paid_date,  rn FROM (
        SELECT o.*, 
            ROW_NUMBER() OVER(PARTITION BY customer_id ORDER BY paid_date, order_id) rn
        FROM orders o
  where paid_date between '2019-01-10' and '2019-01-15'
    ) x WHERE is_paid = 0 and rn=1

使用
不存在的相关子查询

 SELECT order_id, customer_id, amount, is_paid, paid_date,  rn FROM (
        SELECT o.*, 
            ROW_NUMBER() OVER(PARTITION BY customer_id ORDER BY paid_date,order_id) rn
        FROM orders o
         WHERE paid_date between '2019-01-10' 
    and '2019-01-15'
    ) x  where rn=1 and not exists (select 1 from orders o1 where x.order_id=o1.order_id
    and is_paid=1)
输出:

order_id    customer_id amount  is_paid paid_date      rn
3           101          30      0  10/01/2019 00:00:00 1
5           102          15      0  10/01/2019 00:00:00 1
11          104          31      0  10/01/2019 00:00:00 1
15          105          11      0  10/01/2019 00:00:00 1

您期望的输出添加条件是什么?
rn=1
,它应该是
order\u id 3,5,11,15
,现在它唯一的
3,11,15
-它应该只包括在给定时间范围内第一个已付款状态为0的订单。我故意在订单中使用了付款日期,它应该在日期第一个订购,然后,如果订单id相同,不是其他原因,谢谢你的回答,不管怎样,我是遗漏了什么,还是可以简化为:(删除
不存在
子查询,只需添加
is_paid=0
子句?)