根据不使用变量的列获取下一行的值

时间:2019-06-26 16:59:03

标签: mysql sql mysql-workbench

我有一个跟踪用户执行的操作的数据库。我想做的是创建一个新列(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列很困难

2 个答案:

答案 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;

DEMO