解析选择

时间:2018-04-25 14:58:28

标签: postgresql-9.3 postgresql-9.5

我对SQL不是很了不起,我有一个任务,对我来说,相当复杂的用例。我正在将信息从旧的数据库格式迁移到新的,更容易破解的域派生格式。

我在旧数据库中有一个表,我必须按以下方式解析:

下表中的第一行表示系统何时进入状态。第二行表示何时离开输入状态并转换为另一个状态。状态类由状态列指示。

+--------------------------------------+-------------------------+-------------------+-------------+------+-------+
|                 uuid                 |        timestamp        |        mac        | trans_count | type | state |
+--------------------------------------+-------------------------+-------------------+-------------+------+-------+
| 66278266-9727-4d2c-be3f-5a84504bfb90 | 2011-09-26 08:52:57:000 | 00:60:e0:4e:5d:91 |           1 |    0 |     1 |
| 31ff112c-f11b-41c3-b5c2-08ea9e84415a | 2011-09-26 08:53:06:000 | 00:60:e0:4e:5d:91 |           2 |    0 |     0 |
| 88d671c8-8ff7-4bf3-9e58-c7ced815c454 | 2011-09-26 08:53:57:000 | 00:60:e0:4e:5d:91 |           3 |    1 |     1 |
+--------------------------------------+-------------------------+-------------------+-------------+------+-------+

所以,我想以编程方式实现的是这三行应该连接成两行:

+--------------------------------------+--------------------------+----------------------------+------+------------+
|                 uuid                 |          enter           |            exit            | mode |   state    |
+--------------------------------------+--------------------------+----------------------------+------+------------+
| 09570915-d846-48db-ba87-e36c544383bb | 2011-09-26 08:52:57:000  | 2011-09-26 08:53:06:000    | SCO  | INITIATION |
| 2a472124-8ccb-46a4-9f84-cfcdf23a13d7 | 2011-09-26 08:53:06:000  | 2011-09-26 08:53:57:000 |  | SCO  | CLOSED     |
+--------------------------------------+--------------------------+----------------------------+------+------------+

上表中的第一行包含第一个表中第一行的输入时间,以及第一行中第二行的退出时间。新表中的第二行在第一个表中第二行的输入时间,第三行的退出时间。

第一个表中的类型和状态只是序数枚举,我已将其转换为字符串表示,以便能够以更简单的方式从数据库中读取。

我想要的只是指向可以使用哪些技术的指针。我无法触摸原始表,但我可以创建新表来跟踪我在同一数据库中处理的内容。

是否可以获得结果集并引用其中的下一个/前一个元素?推荐的方法是什么?

1 个答案:

答案 0 :(得分:0)

所以,如果有人有兴趣,我就是这样做的:

select
    ss.UUID,
    ss."date" as "enter",
    coalesce(lat."date", ss."date") as "exit",
    ss."type" as "mode",
    ss.STATE,
    scs.CUSTOMER_ID as "session_id"
from
    STAT_CUSTOMER_SESSIONS scs,
    STAT_SESSION ss
left join lateral(
        select
            "date"
        from
            STAT_SESSION ss2,
            STAT_CUSTOMER_SESSIONS scs2
        where
            ss2."date" > ss."date"
            and scs2.SESSION_ID = ss2.UUID
            and scs2.CUSTOMER_ID = scs.CUSTOMER_ID
        order by
            ss2."date" asc limit 1
    ) lat on true
where
    scs.SESSION_ID = ss.UUID