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
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
子句?)