循环基于id的over分区

时间:2018-04-10 09:17:33

标签: sql-server loops while-loop

我有一张这样的表

id  date    Label
1   01.01.2018  abc
1   02.01.2018  ade
1   31.12.2017  bde
1   03.01.2018  tm
2   02.02.2018  lkj
2   03.02.2018  dyj
2   05.02.2018  tm
2   04.02.2018  tm
3   02.01.2018  ui
3   04.02.2018  ght
3   03.02.2018  kiu
3   06.02.2018  hft
3   08.02.2018  ghu
3   01.12.2017  gfdt

我需要应用逻辑,就像每当label = tm根据最新日期按ID分组时,我需要获取label = tm之前的行,如果标签不等于tm根据最新日期按ID分组 然后根据最新日期检索行

id  date            Label
1   01.01.2018      abc
**1 02.01.2018      ade**
1   31.12.17        bde
1   03.01.18        tm
2   02.02.2018      lkj
**2 03.02.2018      dyj**
2   05.02.2018      tm
2   04.02.2018      tm
3   02.01.2018      ui
3   04.02.2018      ght
3   03.02.2018      kiu
3   06.02.2018      hft
3   **08.02.2018    ghu**
3   01.12.2017      gfdt

我的结果表应该是

id  date        Label
1   02.01.2018  ade
2   03.02.2018  dyj
3   08.02.2018  ghu

我需要在sql中应用循环吗? 我不知道如何通过id在over partition上应用循环 请帮我

1 个答案:

答案 0 :(得分:0)

我认为您只需删除Label = tm的行,然后搜索每个ID的最大日期

select
    id, date, label
from (
    select
        *, rn = row_number() over (partition by id order by date desc)
    from
        myTable
    where
        label <> 'tm'
) t
where
    rn = 1