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

时间:2015-06-29 20:08:17

标签: sql oracle

我有一个包含以下列的表:customer_id,event_date_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)

编辑:我正在添加一些示例数据:

+---------+-----------------+-------------+---+
| cust_id | event_datetime  | DIFFERENCE  | X |
+---------+-----------------+-------------+---+
|       1 | 6/20/2015 23:35 | 0           | x |
|       1 | 6/21/2015 0:09  | 0.558611111 |   |
|       1 | 6/21/2015 0:49  | 0.667777778 |   |
|       1 | 6/21/2015 1:30  | 0.688333333 |   |
|       1 | 6/21/2015 9:38  | 8.133055556 |   |
|       1 | 6/21/2015 10:09 | 0.511111111 |   |
|       1 | 6/21/2015 10:45 | 0.600555556 |   |
|       1 | 6/21/2015 11:09 | 0.411111111 |   |
|       1 | 6/21/2015 11:32 | 0.381666667 |   |
|       1 | 6/21/2015 11:55 | 0.385       | x |
|       1 | 6/21/2015 12:18 | 0.383055556 |   |
|       1 | 6/21/2015 12:23 | 0.074444444 |   |
|       1 | 6/22/2015 10:01 | 21.63527778 | x |
|       1 | 6/22/2015 10:24 | 0.380555556 |   |
|       1 | 6/22/2015 10:46 | 0.373611111 |   |
+---------+-----------------+-------------+---+

&#34; x&#34;是因为它们是12小时区块中的第一条记录而应该被拉出的记录。

1 个答案:

答案 0 :(得分:0)

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

如果是这样,您需要修改您的查询以获得与每个客户的* first *时间的差异。其余的只是算术。查询看起来像这样:

{{1}}