SQL 用于识别 20 分钟内下订单的百分比

Posted

技术标签:

【中文标题】SQL 用于识别 20 分钟内下订单的百分比【英文标题】:SQL for identifying % of orders placed within 20 minutes of each other 【发布时间】:2021-06-12 17:08:02 【问题描述】:

拥有如下所示的数据集,并想知道解决以下问题的各种方法:20 分钟内的订单占多少?

CustomerId Order_# Order_Date
123 000112 12/25/2011 10:30
123 000113 12/25/2011 10:35
123 000114 12/25/2011 10:45
123 000115 12/25/2011 10:55
456 000113 12/25/2011 10:35
456 000113 1/25/2011 10:30
789 000117 9/25/2011 2:00

结果集应如下所示:

3/7 = 0.42%

我的方法是首先对表进行自联接,以获取在 20% 以内但难以取出重复行的行数。

无论如何,期待看到一些狡猾的答案。

谢谢。

【问题讨论】:

编辑您的问题并显示您想要的结果。同时标记您正在使用的数据库。 谢谢 Gordon,为 SQL Server 添加标签 我数了 4 个在另一个订单的 20 分钟内,而不是 3 个。 【参考方案1】:

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

【讨论】:

谢谢。下面修改后的查询也会给出相同的结果吗? SELECT SUM(TIMEDIFF)/CONVERT(decimal(4,2),COUNT(ORDER_ID)) FROM (SELECT CASE WHEN DATEDIFF(MINUTE,prev_order_date,next_order_date)

以上是关于SQL 用于识别 20 分钟内下订单的百分比的主要内容,如果未能解决你的问题,请参考以下文章

用于计算同一列的值百分比的 SQL [关闭]

用于执行聚合和计算百分比的 SQL 查询

在 SQL 中计算总行数的百分比

SQL Server中协助计算百分比

如何使用 Binance API 和 Python-CCXT 下达百分比订单?

SQL:您如何在列中显示占总数的百分比?