按浮动日期范围分组

Ser*_*kin 6 sql postgresql grouping group-by window-functions

我正在使用PostgreSQL 9.2.
我有一些表,其中包含一些设备停止运行的时间.

+----------+----------+---------------------+
| event_id |  device  |         time        |
+----------+----------+---------------------+
|        1 | Switch4  | 2013-09-01 00:01:00 |
|        2 | Switch1  | 2013-09-01 00:02:30 |
|        3 | Switch10 | 2013-09-01 00:02:40 |
|        4 | Switch51 | 2013-09-01 03:05:00 |
|        5 | Switch49 | 2013-09-02 13:00:00 |
|        6 | Switch28 | 2013-09-02 13:01:00 |
|        7 | Switch9  | 2013-09-02 13:02:00 |
+----------+----------+---------------------+
Run Code Online (Sandbox Code Playgroud)

我希望将行分组+/- 3分钟的时差,如下所示:

+----------+----------+---------------------+--------+
| event_id |  device  |         time        |  group |
+----------+----------+---------------------+--------+
|        1 | Switch4  | 2013-09-01 00:01:00 |      1 |
|        2 | Switch1  | 2013-09-01 00:02:30 |      1 |
|        3 | Switch10 | 2013-09-01 00:02:40 |      1 |
|        4 | Switch51 | 2013-09-01 03:05:00 |      2 |
|        5 | Switch49 | 2013-09-02 13:00:00 |      3 |
|        6 | Switch28 | 2013-09-02 13:01:00 |      3 |
|        7 | Switch9  | 2013-09-02 13:02:00 |      3 |
+----------+----------+---------------------+--------+
Run Code Online (Sandbox Code Playgroud)

我尝试使用窗口函数,但在子句中

[范围| ROWS] BETWEEN frame_start和frame_end,其中frame_start和frame_end可以是UNBOUNDED PRECEDING值PRECEDING CURRENT ROW值之一,遵循UNBOUNDED FOLLOWING,

value必须是不包含任何变量,聚合函数或窗口函数的整数表达式

所以,考虑到这一点,我无法指出时间间隔.现在我怀疑窗口功能可以解决我的问题.你可以帮帮我吗?

Clo*_*eto 5

SQL小提琴

select
    event_id, device, ts,
    floor(extract(epoch from ts) / 180) as group
from t
order by ts
Run Code Online (Sandbox Code Playgroud)

使用窗口函数可以使组编号从1开始,但是如果必要的话,我不知道这是一个不小的代价.就是这个

select
    event_id, device, ts,
    dense_rank() over(order by "group") as group
from (
    select
        event_id, device, ts,
        floor(extract(epoch from ts) / 180) as group
    from t
) s
order by ts
Run Code Online (Sandbox Code Playgroud)

time是一个保留字.选择另一个作为列名称.