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