首页 > 解决方案 > 加入下一行的同一个键

问题描述

假设我们有一个包含customer_idorder_date和的表ship_date。当同一客户的下一个客户在最后一个客户的几天之order_date内时,就会重新订购产品。30ship_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_dateship_date

标签: sqlsql-server

解决方案


一种方法是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);

推荐阅读