想象一下下表:
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'
答案 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()
,因此它不受过滤器的影响。