sql - 加入下一行的同一个键
问题描述
假设我们有一个包含customer_id
、order_date
和的表ship_date
。当同一客户的下一个客户在最后一个客户的几天之order_date
内时,就会重新订购产品。30
ship_date
select * from mytable
customer_id order_date ship_date
1 2017-08-04 2017-08-09
1 2017-09-01 2017-09-05
2 2017-02-02 2017-03-01
2 2017-04-05 2017-04-09
2 2017-04-15 2017-04-19
3 2018-02-02 2018-03-01
要求:重新订购
customer_id order_date ship_date
1 2017-09-01 2017-09-05
2 2017-04-15 2017-04-19
我如何才能
在最后一个30天内只检索有重新订购的相同客户的记录。order_date
ship_date
解决方案
一种方法是lead()
:
select t.customer_id, t.order_date, t.next_ship_date
from (select t.*,
lead(order_date) over (partition by customer_id order by order_date) as next_order_date
lead(ship_date) over (partition by customer_id order by order_date) as next_ship_date
from t
) t
where next_order_date < dateadd(day, 30, ship_date);
编辑:
如果您想要“重新排序”行,只需使用lag()
:
select t.*
from (select t.*,
lag(ship_date) over (partition by customer_id order by order_date) as prev_ship_date
from t
) t
where prev_ship_date > dateadd(day, 30, order_date);
推荐阅读
- c++ - 头文件中命名空间内的函数,在cpp文件中使用'using'声明未编译
- java - Java OOP中默认构造函数中的超级关键字
- acumatica - 从销售报价单创建销售订单时出错 (CR304500)
- wikipedia - 如何通过建立从维基百科文章实体到维基数据实体的一对一映射来构建远程监督关系提取数据集?
- javascript - Javascript:将数据从本地传递到全局
- docker-compose - Let's Encrypt with Traefik - JWS 有一个无效的反重放随机数
- firebase - “-bash:firebase:找不到命令”
- css - 在 CSS 中使容器响应式
- c++ - 如何从VS 2019编译的函数中提取机器码?
- javascript - 如何从 Javascript 输出中删除这些引号?