我对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 |
+--------------------------------------+--------------------------+----------------------------+------+------------+
上表中的第一行包含第一个表中第一行的输入时间,以及第一行中第二行的退出时间。新表中的第二行在第一个表中第二行的输入时间,第三行的退出时间。
第一个表中的类型和状态只是序数枚举,我已将其转换为字符串表示,以便能够以更简单的方式从数据库中读取。
我想要的只是指向可以使用哪些技术的指针。我无法触摸原始表,但我可以创建新表来跟踪我在同一数据库中处理的内容。
是否可以获得结果集并引用其中的下一个/前一个元素?推荐的方法是什么?
答案 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