如何在组内使用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)。如果没有自连接解决方案,这可能会起作用