代码之家  ›  专栏  ›  技术社区  ›  user

使用LAG、FIRST\U值等构建组

  •  2
  • user  · 技术社区  · 8 年前

    有序查询提供以下结果:

    val1    val2    val3                        id  
    1303    1303    22.03.18 14:00:03.915000000 1
    1303    1303    22.03.18 14:00:07.800000000 2
    1303    1303    23.03.18 12:15:03.798000000 3
    1303    1303    23.03.18 12:15:09.345000000 4
    9999    1303    23.03.18 21:00:00.000000000 5
    1303    1303    23.03.18 23:15:09.345000000 6
    9999    1303    23.03.18 23:18:09.345000000 7
    9999    1303    23.03.18 23:19:09.345000000 8
    1303    1303    23.03.18 23:20:09.345000000 9
    1303    1303    23.03.18 23:55:09.345000000 10
    

    我现在要做的是建立团队。每当val1更改时,应使用该组第一行的rowid创建一个新组。每当val1是9999时,它总是必须是一个自己的单独组,以保持其rowid。我需要的结果是:

    val1    val2    val3                        id  
    1303    1303    22.03.18 14:00:03.915000000 1
    1303    1303    22.03.18 14:00:07.800000000 1
    1303    1303    23.03.18 12:15:03.798000000 1
    1303    1303    23.03.18 12:15:09.345000000 1
    9999    1303    23.03.18 21:00:00.000000000 5
    1303    1303    23.03.18 23:15:09.345000000 6
    9999    1303    23.03.18 23:18:09.345000000 7
    9999    1303    23.03.18 23:19:09.345000000 8
    1303    1303    23.03.18 23:20:09.345000000 9
    1303    1303    23.03.18 23:55:09.345000000 9
    

    我认为通过使用LAG、FIRST\u VALUE等函数应该可以做到这一点。但无论我怎么尝试,我都做不好。

    1 回复  |  直到 8 年前
        1
  •  0
  •   wolfrevokcats    8 年前

    我已经得出了以下代码,可能还有改进的余地:

    WITH t1 AS (
      SELECT val1, id, lag(val1) over(ORDER BY id) lg 
      FROM test
    )
    , t2 AS (
      SELECT val1, id, lg
      , last_value(decode(val1,9999,id,lg,NULL,id) ignore nulls) over(ORDER BY id) lv 
      FROM t1
    )
    SELECT  t2.id, t2.val1, rank() over(ORDER BY lv) r
    FROM t2
    ORDER BY id 
    

    ID  VAL1  R 
    --- ----- --
    1   1303  1 
    2   1303  1 
    3   1303  1 
    4   1303  1 
    5   9999  5 
    6   1303  6 
    7   9999  7 
    8   9999  8 
    9   1303  9 
    10  1303  9