我有一个跟踪用户执行的操作的数据库。我想做的是创建一个新列(follow_up),该列基于用户在会话期间执行的下一个操作(即会话中的下一个event_id)填充。不幸的是,我没有使用或创建变量的能力-这显然使事情变得更加复杂,因为我无法创建行号变量。
我的数据如下:
Session ID | Event_ID | Action
1 | 1 | Action A
1 | 2 | Action B
2 | 3 | Action A
1 | 4 | Action C
2 | 5 | Action C
2 | 6 | Action A
3 | 7 | Action B
1 | 8 | Action A
2 | 9 | Action C
3 | 10 | Action C
我想要我的最终数据集是:
Session_ID | Event_ID | Action | Follow_Up
1 | 1 | Action A | Action B
1 | 2 | Action B | Action C
2 | 3 | Action A | Action C
1 | 4 | Action C | Action A
2 | 5 | Action C | Action A
2 | 6 | Action A | Action C
3 | 7 | Action B | Action C
1 | 8 | Action A | Null
2 | 9 | Action C | Null
3 | 10 | Action C | Null
此代码提取此数据非常简单。事实证明,添加到follow_up列很困难
答案 0 :(得分:0)
假设Event_Id
是唯一的且递增,则可以像这样获得Follow_Up
列:
select
t.*,
(
select Action from tablename
where Event_Id = (
select min(Event_Id) from tablename
where Session_id = t.Session_id and Event_id > t.Event_id
)
) Follow_Up
from tablename t
请参见demo。
结果:
| Session_ID | Event_ID | Action | Follow_Up |
| ---------- | -------- | -------- | --------- |
| 1 | 1 | Action A | Action B |
| 1 | 2 | Action B | Action C |
| 2 | 3 | Action A | Action C |
| 1 | 4 | Action C | Action A |
| 2 | 5 | Action C | Action A |
| 2 | 6 | Action A | Action C |
| 3 | 7 | Action B | Action C |
| 1 | 8 | Action A | |
| 2 | 9 | Action C | |
| 3 | 10 | Action C | |
答案 1 :(得分:0)
Follow_up列根据用户在会话期间执行的下一个操作(即会话中使用子查询的下一个event_id)填充
select
Session_ID,
Event_ID ,
Action,
(select Action from test t1
where t1.Event_ID>t.Event_ID and t1.Session_ID=t.Session_ID
limit 1) Follow_up
from test t;