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
,对于订单1212
和1215
,您如何获得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:连续行之间的差异的主要内容,如果未能解决你的问题,请参考以下文章
在 Access 中使用 ODBC 连接到 MS SQL Server 2012:手动调用查询和在 VBA 中调用查询之间的巨大时间差异