使用LAG,FIRST_VALUE等构建组

时间:2018-03-25 15:14:27

标签: sql oracle grouping aggregate-functions

有序查询提供此结果:

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_VALUE等功能来实现。我尝试使用它,我做得不对。

1 个答案:

答案 0 :(得分:0)

我已经到了这个代码,这可能还有改进的余地:

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