有序查询提供此结果:
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等功能来实现。我尝试使用它,我做得不对。
答案 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