SQL 用于识别在 20 分钟内下达的订单百分比
SQL for identifying % of orders placed within 20 minutes of each other
有如下数据集,想知道解决以下问题的各种方法:有多少百分比的订单彼此相隔 20 分钟以内?
客户编号
订单_#
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
9/25/20112:00
结果集应如下所示:
3/7 = 0.42%
我的方法是首先使用 table 进行自连接,以获取落在 20% 以内但难以删除重复行的行数。
无论如何,期待看到一些狡猾的答案。
谢谢。
您可以使用 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;
请注意,date/time 函数在不同数据库中差异很大。这使用标准 SQL 语法进行比较。确切的语法可能会有所不同,具体取决于您的数据库。
如果您想要每个客户 ,则将 group by customer_id
添加到查询中,将 customer_id
添加到 select
。
编辑:
在 SQL 服务器中,这将是:
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;
有如下数据集,想知道解决以下问题的各种方法:有多少百分比的订单彼此相隔 20 分钟以内?
客户编号 | 订单_# | 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 | 9/25/20112:00 |
结果集应如下所示:
3/7 = 0.42%
我的方法是首先使用 table 进行自连接,以获取落在 20% 以内但难以删除重复行的行数。
无论如何,期待看到一些狡猾的答案。
谢谢。
您可以使用 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;
请注意,date/time 函数在不同数据库中差异很大。这使用标准 SQL 语法进行比较。确切的语法可能会有所不同,具体取决于您的数据库。
如果您想要每个客户 ,则将 group by customer_id
添加到查询中,将 customer_id
添加到 select
。
编辑:
在 SQL 服务器中,这将是:
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;