有一个如下的数据集,想知道解决以下问题的各种方法:订单在20分钟内的百分比是多少?
客户ID | Order_# | Order_Date|
---|---|---|
123 | 000112 | 2011年12月25日10:30 |
123 | 000113 | 2011年12月25日10:35 |
123 | 000114 | 2011年12月25日10:45 |
123 | 000115 | 2011年12月25日10:55 |
456 | 000113 | 2011年12月25日10:35 |
456 | 000113 | 2011年1月25日10:30 |
789 | 000117 | 2011年9月25日2:00 |
您可以使用lead()
和lag()
:
select avg( case when prev_order_date > order_date - interval '20 minute' or
next_order_date < order_date + interval '20 minute'
then 1.0 else 0
end) as ratio_within_20_minutes
from (select t.*,
lag(order_date) over (partition by customer_id order by order_date) as prev_order_date,
lead(order_date) over (partition by customer_id order by order_date) as next_order_date
from t
) t;
请注意,数据库之间的日期/时间函数差异很大。这将使用标准SQL语法进行比较。确切的语法可能会有所不同,具体取决于您的数据库。
如果您希望每个客户都使用此,则将group by customer_id
添加到查询中,将customer_id
添加到select
中。
编辑:
在SQL Server中,这将是:
select avg( case when prev_order_date > dateadd(minute, -20, order_date) or
next_order_date < dateadd(minute, 20, order_date)
then 1.0 else 0
end) as ratio_within_20_minutes
from (select t.*,
lag(order_date) over (partition by customer_id order by order_date) as prev_order_date,
lead(order_date) over (partition by customer_id order by order_date) as next_order_date
from t
) t;