SQL中运行的事务活动总数

SQL中运行的事务活动总数,sql,oracle,time-series,analytic-functions,Sql,Oracle,Time Series,Analytic Functions,我正在使用事务表。我想生成一些变量,以确定同一客户在过去5分钟和30分钟、1,2,3和4小时以及1,2,5和10天内执行的交易数量。在事务表中生成此类列的有效方法是什么解决方案将是一个运行总数,直到每个事务时间。我可以使用Oracle和其他SQL变体 我认为您不想实际存储这些统计数据,因为它们会因其时间性质而不断变化。解决方案实际上取决于您将如何使用这些统计数据。我可以想出两个主要的方法: 针对给定唯一客户的特殊查询—在本例中,我将使用一个存储过程,将客户id和时间范围作为参数,并返回每个客户的

我正在使用事务表。我想生成一些变量,以确定同一客户在过去5分钟和30分钟、1,2,3和4小时以及1,2,5和10天内执行的交易数量。在事务表中生成此类列的有效方法是什么解决方案将是一个运行总数,直到每个事务时间。我可以使用Oracle和其他SQL变体

我认为您不想实际存储这些统计数据,因为它们会因其时间性质而不断变化。解决方案实际上取决于您将如何使用这些统计数据。我可以想出两个主要的方法:

针对给定唯一客户的特殊查询—在本例中,我将使用一个存储过程,将客户id和时间范围作为参数,并返回每个客户的相关事务数

跨多个窗口为多个客户提供“标准化”报告—在这种情况下,您可能希望每个时间段都有一个视图,选择适当时间段内的所有客户和每个客户的交易数量

如果您能给我们一些关于您的用例的更多信息,我们将能够更具体地针对单个客户:

我能想到的最好的解决方案不是使用分析,而是使用子功能查询/公共表表达式。Oracle通常非常聪明,知道是否将它们转换为临时表,从而降低了对同一数据进行多次传递的成本

with txns as 
       (select customer_id
               txn_id,
               txn_ts
          from transaction_table
         where customer_id = ?
           AND txn_ts >= SYSTIMESTAMP - NUMTODSINTERVAL(10, 'DAY')
       )
select customer_id,
       (select count(*) from txns 
         where event_ts >= systimestamp - numtodsinterval(5/1440, 'day')) 
         as txn_5_min,
       (select count(*) from txns 
         where event_ts >= systimestamp - numtodsinterval(30/1440, 'day')) 
         as txn_30_min,
       (select count(*) from txns 
         where event_ts >= systimestamp - numtodsinterval(1/24, 'day')) 
         as txn_1_hour,
       (select count(*) from txns 
         where event_ts >= systimestamp - numtodsinterval(2/24, 'day')) 
         as txn_2_hour,
       (select count(*) from txns 
         where event_ts >= systimestamp - numtodsinterval(3/24, 'day')) 
         as txn_3_hour,
       (select count(*) from txns 
         where event_ts >= systimestamp - numtodsinterval(4/24, 'day')) 
         as txn_4_hour,
       (select count(*) from txns 
         where event_ts >= systimestamp - numtodsinterval(1, 'day')) 
         as txn_1_day,
       (select count(*) from txns 
         where event_ts >= systimestamp - numtodsinterval(2, 'day')) 
         as txn_2_day,
       (select count(*) from txns 
         where event_ts >= systimestamp - numtodsinterval(5, 'day')) 
         as txn_5_day,
       (select count(*) from txns 
         where event_ts >= systimestamp - numtodsinterval(10, 'day')) 
         as txn_10_day
  from customer
 WHERE customer_id = ?;

您将能够在多客户情况下使用类似的实现,尽管效率肯定会受到影响。当你完成它时,考虑你的5分钟水平数据是否会对所有的客户来说都是陈旧的。

当你提供一些示例数据,例如样本交易和样本输出时,这将是一个很好的问题。此外,您是想在表中实际提供这些数据,还是想从SELECT或视图中获取这些数据?我猜输出将是……对于每个订单日期时间,您都会读取“5天内的最后一笔交易数”列,例如,这将给出该期间相对于该行datetime的订单数。我认为OP对正确使用分析函数非常感兴趣。例如,[用户、时间框架等]交易的SUMAMOUNT超额分配显示为customerID、订单日期时间以及每行的其他订单信息。StevieG,我相信我在追求第二个解决方案,因为我希望根据解决方案中的信息为所有客户执行统计建模。