代码之家  ›  专栏  ›  技术社区  ›  Martin Bobak

如何在组内使用sql server中的延迟?

  •  0
  • Martin Bobak  · 技术社区  · 7 年前

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

    Recordset:

    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。

    2 回复  |  直到 7 年前
        1
  •  2
  •   The Impaler    7 年前

    你其实不需要 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);
    
        2
  •  0
  •   Vaidøtas I.    7 年前

    我建议使用lead在剩余的列表中搜索一行“僵尸”,并通过分组来消除欺骗(以第一个找到的职业作为id)。如果没有self-join解决方案,这就可以工作。