返回每个单独行的特定Windows时间范围中的第二个最新值

时间:2018-04-24 10:17:19

标签: sql google-bigquery

想象一下下表:

UserName    paymentType      date(YYYY-MM-DD)          Status   
x           transaction      2016-09-16                1         
x           UpdateStatus     2016-10-22                2        
x           transaction      2017-01-08                2        
x           transaction      2017-06-12                2         
x           UpdateStatus     2017-08-27                3
x           transaction      2018-11-08                3
x           transaction      2018-11-08                3

我希望能够查询所有UpdateStatus paymentType事件的列表,其中包含与每个状态更新事件关联的先前状态。像这样:

UserName  paymentType    date(YYYY-MM-DD)     Status    Previous_status          
x         UpdateStatus   2016-10-22           2         1       
x         UpdateStatus   2017-08-27           3         2

我知道我需要使用子查询来查询整个表,首先只过滤where paymentType='UpdateStatus'全局查询。但是,我不知道如何获得与每个状态更新相关联的先前状态。我想我需要在某个地方使用windows时间帧功能。基本上previous_status需要是日期不如每行的UpdateStatus日期事件的最后状态。

这是我迄今为止构建的查询...

SELECT
  UserName,
  paymentType,
  date,
  status,
  Sub.Previous_status
FROM
  `Payment_table` as p
JOIN (
  SELECT 
  UserName,
  < get the Previous_status here > as previous_status 
  FROM
  `Payment_table` as s
  ) AS Sub ON 
  p.UserName=sub.UserName
WHERE
  paymentType = 'UpdateStatus'

1 个答案:

答案 0 :(得分:2)

使用lag()

select pt.*
from (select pt.*, lag(status) over (order by date) as prev_status
      from payment_table pt
     ) pt
where paymentType = 'UpdateStatus';

您需要在子查询中执行lag(),因此它不受过滤器的影响。