首页 > 解决方案 > 在 Amazon Redshift 的列中获取特定值之后的下一条记录

问题描述

我有一些数据如下:

Session_id,Created_at, pagetype
1,2018-08-08,A
1,2018-08-08,B
1,2018-08-08,C
1,2018-08-08,A
1,2018-08-08,D
1,2018-08-08,A
2,2018-08-18,D
2,2018-08-18,C
2,2018-08-18,A
2,2018-08-18,B
2,2018-08-18,B

在任何给定会话中,只要列Pagetype中的值为 ,我想获取当前行和下一行。A即使当前会话中没有下一行,我也想要当前行。所以结果集看起来像这样:

Session_id,Created_at, pagetype
1,2018-08-08,A
1,2018-08-08,B
1,2018-08-08,A
1,2018-08-08,D
1,2018-08-08,A
2,2018-08-18,A
2,2018-08-18,B

我会分享一个初始查询来执行此操作,但我不知道如何开始。我确信有一些窗口功能可用于这项工作。

任何帮助将非常感激。

标签: sqlpostgresqlamazon-redshift

解决方案


用于lag获取上一行的值。(假设是created_at日期时间类型,否则使用不同的列来打破关系以获得稳定的结果)

select *
from (select t.*,lag(pagetype) over(partition by session_id order by created_at) as prev_pagetype
      from tbl t
     ) t 
where pagetype = 'A' or (prev_pagetype = 'A' and pagetype <> 'A')

推荐阅读