我的postgres数据库中有一个“响应”表,看起来像
| id | question_id |
| 1 | 1 |
| 2 | 2 |
| 3 | 1 |
| 4 | 2 |
| 5 | 2 |
我想生成一个包含响应和问题ID的表,以及具有相同问题ID的上一个响应的ID,因此
| id | question_id | lag_resp_id |
| 1 | 1 | |
| 2 | 2 | |
| 3 | 1 | 1 |
| 4 | 2 | 2 |
| 5 | 2 | 4 |
显然,将“lag(responses.id)”拉过(依次由response.id),将拉出先前的响应ID而不管question_id。我尝试了下面的子查询,但我知道这是错误的,因为我基本上为子查询中的每个问题id创建了一个所有滞后id的表。
select
responses.question_id,
responses.id as response_id,
(select
lag(r2.id, 1) over (order by r2.id)
from
responses as r2
where
r2.question_id = responses.question_id
)
from
responses
我不知道我是否正在使用子查询,或者我是否需要做更高级的事情(可能涉及“分区依据”,我不知道如何使用)。
非常感谢任何帮助。
答案 0 :(得分:1)
使用partition by
。这里不需要相关的子查询。
select id,question_id,
lag(id) over (partition by question_id order by id) lag_resp_id
from responses