SQL:连续行之间的差异

问题描述

具有3列的表格:订单ID,会员ID,订单日期

enter image description here

需要按会员编号将按天数b / w细分的订单分布拉低2个连续订单

我有什么?

SELECT 
  a1.member_id,count(distinct a1.order_id) as num_orders,a1.order_date,DATEDIFF(DAY,a2.order_date) as days_since_last_order
from orders as a1 
inner join orders as a2 
  on a2.member_id = a1.member_id+1;

这并不能完全帮助我,因为我需要的输出是:

enter image description here

解决方法

您可以使用lag()来获取同一位客户的上一个订单的日期:

select o.*,datediff(
        order_date,lag(order_date) over(partition by member_id order by order_date,order_id)
    ) days_diff
from orders o

如果同一日期有两行,则首先考虑最小的order_id。还要注意,我已修复了datediff()语法:在Hive中,该函数仅需要两个日期,并且没有单位。

我只是不了解您要计算num_orders的逻辑。

,

可能是这样的:

SELECT 
  a1.member_id,count(distinct a1.order_id) as num_orders,a1.order_date,DATEDIFF(DAY,a2.order_date) as days_since_last_order
from orders as a1 
inner join orders as a2 
  on a2.member_id = a1.member_id
where not exists (
      select intermediate_order
      from orders as intermedite_order 
      where intermediate_order.order_date < a1.order_date and intermediate_order.order_date > a2.order_date) ;