Sql 如何按自定义和值进行分区?

Sql 如何按自定义和值进行分区?,sql,oracle,Sql,Oracle,我有一个包含以下列的表:customer\u id、event\u date\u time 我想计算一下,从活动开始起,每12小时,客户触发事件的次数换句话说,按客户将事件之间的时间累计为12小时。 例如,如果客户在中午、下午1:30、下午5点、凌晨2点和下午3点触发事件(按顺序),我将返回中午、凌晨2点和下午3点的记录 我写了这个查询: select cust_id, event_datetime, nvl(24*(event_datetime - lag(event_

我有一个包含以下列的表:customer\u id、event\u date\u time

我想计算一下,从活动开始起,每12小时,客户触发事件的次数换句话说,按客户将事件之间的时间累计为12小时。

例如,如果客户在中午、下午1:30、下午5点、凌晨2点和下午3点触发事件(按顺序),我将返回中午、凌晨2点和下午3点的记录

我写了这个查询:

select
    cust_id,
    event_datetime,
    nvl(24*(event_datetime - lag(event_datetime) over (partition BY cust_id ORDER BY event_datetime)),0) as difference
from
  tbl
我觉得我已经接近这个了。有没有办法添加类似的内容

 over (partition BY cust_id, sum(difference)<12 ORDER BY event_datetime)

“x”是应该提取的记录,因为它们是12小时块中的第一条记录。

如果我理解正确,您希望每个12小时块中的第一条记录,其中时间块由第一个事件时间定义

如果是这样,您需要修改查询,以获得每个客户*第一次*的差异。剩下的只是算术。查询将如下所示:

with t as (
    select cust_id, event_datetime,
           (24 * (event_datetime -
                  coalesce(min(event_datetime) over (partition by cust_id ), 0)
           ) as difference
    from tbl
   )
select t.*
from (select t.*, 
             row_number() over (partition by cust_id, floor(difference / 12)
                                order by difference) as seqnum
      from t
     ) t
where seqnum = 1;

确保标记您正在使用的RDBMS感谢您的回复!它非常接近,但不起作用。你的假设是正确的。我将在下面的示例中添加一些示例OP@rogre . . . 我不确定我刚才所做的改变是否能解决这个问题。如果没有,请说明问题所在。
with t as (
    select cust_id, event_datetime,
           (24 * (event_datetime -
                  coalesce(min(event_datetime) over (partition by cust_id ), 0)
           ) as difference
    from tbl
   )
select t.*
from (select t.*, 
             row_number() over (partition by cust_id, floor(difference / 12)
                                order by difference) as seqnum
      from t
     ) t
where seqnum = 1;