窗口函数受单独列中的值限制

时间:2016-09-29 15:56:19

标签: sql postgresql

我的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

我不知道我是否正在使用子查询,或者我是否需要做更高级的事情(可能涉及“分区依据”,我不知道如何使用)。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

使用partition by。这里不需要相关的子查询。

select id,question_id,
lag(id) over (partition by question_id order by id) lag_resp_id
from responses