SQL:连续行之间的差异

Posted

技术标签:

【中文标题】SQL:连续行之间的差异【英文标题】:SQL: Difference between consecutive rows 【发布时间】:2020-10-23 23:13:31 【问题描述】:

包含 3 列的表格:订单 ID、会员 ID、订单日期

需要拉取按天数b/w 2个连续订单按会员id细分的订单分布

我拥有的是这样的:

SELECT 
  a1.member_id,
  count(distinct a1.order_id) as num_orders, 
  a1.order_date, 
  DATEDIFF(DAY, a1.order_date, 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;

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

【问题讨论】:

计算num_orders的逻辑是什么?我不明白。 对不起,这是count() 这是什么逻辑?例如,对于客户22222,对于订单12121215,您如何获得2,对于以下两个订单,您如何获得1 这是一个项目类型的 order_id。一个人可以订购 2 份相同的商品,例如 2 杯咖啡。咖啡的 Order_id 相同,例如:138 但 num_orders 为 2 但这不是强制性的,我要计算的是member_id的“自上次订单以来的天数”列 【参考方案1】:

您可以使用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

【讨论】:

感谢分享,我是滞后功能的新手,所以正在尝试自我加入。您的查询实际上有所帮助,它有效。我想我会在这个查询/表的基础上计算 num_orders【参考方案2】:

可能是这样的:

SELECT 
  a1.member_id,
  count(distinct a1.order_id) as num_orders, 
  a1.order_date, 
  DATEDIFF(DAY, a1.order_date, 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) ;

【讨论】:

以上是关于SQL:连续行之间的差异的主要内容,如果未能解决你的问题,请参考以下文章

添加一列,这是熊猫中连续行差异的结果

计算Hive中计数器数据的差异

每行之间具有固定时间跨度的 SQL 连续行

在 Access 中使用 ODBC 连接到 MS SQL Server 2012:手动调用查询和在 VBA 中调用查询之间的巨大时间差异

pandas从数据框中用连续的差异过滤行< n。

SQL中的连接,实例和会话之间的差异