我有一个包含国家代码,状态,changestatusdate的表。
我想获取每个国家代码的最后状态和seconf的最后状态,但是我有问题:
对于某些国家代码,changestatusdate已修改并获得新值,但是状态未修改,因此我们不能使用changestatusdate显示状态修改。
例如,我们有此数据:
national code status changestatusdate
123 1 20150101
123 2 20150301
123 2 20150315
123 3 20150601
123 1 20151201
123 5 20160101
123 5 20160301
我们需要最后一个状态(5)和第二个最后一个状态(1)。...我们如何检索这些数据?
我提出以下方法:
在查询中,它看起来像:
select t.national_code,
max(case when seqnum = 1 then status end) as last_status,
max(case when seqnum = 2 then status end) as last_status_but_one
from (select t.*,
row_number() over (partition by national_code order changestatusdate desc) as seqnum
from (select t.*,
lag(status) over (partition by national_code order by changestatusdate) as prev_status
from t
) t
where prev_status is null or prev_status <> status
) t
where seqnum <= 2
group by national_code;