如何在组内使用SQL Server中的延迟?

如何在组内使用SQL Server中的延迟?,sql,sql-server,Sql,Sql Server,下面是不同的人和他们成为僵尸前的职业列表。我需要在这个人变成僵尸之前找到他的职业。最后一个人变成了僵尸,然后又回到动物园管理员那里,最后又变成了僵尸。在这种情况下,我只需要在第一次僵尸转换之前占领 记录集: Person Occupation Order_of_events --------------------------------------- 1 Lawyer 1 1 Dog Walker 2 1 Zoo

下面是不同的人和他们成为僵尸前的职业列表。我需要在这个人变成僵尸之前找到他的职业。最后一个人变成了僵尸,然后又回到动物园管理员那里,最后又变成了僵尸。在这种情况下,我只需要在第一次僵尸转换之前占领

记录集:

Person    Occupation    Order_of_events
---------------------------------------
1         Lawyer        1
1         Dog Walker    2
1         Zoo Keeper    3
1         Zombie        4
1         Driver        5
2         Lifeguard     1
2         Zombie        2
3         Zoo Keeper    1
3         Zombie        2
3         Driver        3
3         Zombie        4
最终结果

Person    Occupation
---------------------
1         Zoo Keeper
2         Lifeguard
3         Zoo Keeper
我的尝试:

SELECT 
    person, occupation, Order_of_events,
    LAG(occupation, 1, 'Always a zombie') OVER (PARTITION BY person ORDER BY Order_of_events) AS [previous occupation]
FROM 
    table
我认为我的问题在分区中,但我对如何选择僵尸所在的前一行感到困惑


我正在使用SQL Server 2017。

您实际上不需要使用
lag()
。但窗口功能将有助于:

select top (1) with ties tprev.*
from t join
     t tprev
     on t.person = tprev.person 
    and t.Order_of_events = tprev.Order_of_events + 1
where t.occupation = 'Zombie'
order by row_number() over (partition by t.person order by t.Order_of_events);

实际上,您不需要使用
lag()
。但窗口功能将有助于:

select top (1) with ties tprev.*
from t join
     t tprev
     on t.person = tprev.person 
    and t.Order_of_events = tprev.Order_of_events + 1
where t.occupation = 'Zombie'
order by row_number() over (partition by t.person order by t.Order_of_events);

我建议使用LEAD搜索剩余列表中的一行“僵尸”,并进行分组以消除重复(以找到的第一个职业作为id)。这在没有自加入解决方案的情况下可能会起作用。

我建议使用LEAD在剩余列表中搜索一行“僵尸”,并进行分组以消除重复(以找到的第一个职业作为id)。如果没有自连接解决方案,这可能会起作用