这是我的样本数据
id|score|
--+-----+
1| 10|
2| 20|
3| 30|
4| 40|
5| 50|
6| 60|
7| 30|
8| 30|
9| 90|
10| 100|
我的预期输出是
id|score|_prev_element|
--+-----+-------------+
1| 10| NULL|
2| 20| 10|
3| 30| 20|
4| 40| 20|
5| 50| 40|
6| 60| 50|
7| 30| 60|
8| 30| 60|
9| 90| 60|
10| 100| 90|
_prev_element - 想要显示前一个元素,即 id=2,然后前一个元素的值为 10。如果前一个元素为 30,则跳过并打印最近的值(不是 30)。 例如,对于 id =8,前一个元素是 30,所以我跳过并选择 60 对于 id=9 ,前面的元素 8 和 7 是 30,所以跳过并选择 60。我怎样才能达到这个结果。我尝试了腿(得分)(按 ID 排序)..不走运
你可以这样做:
with
x as (
select *,
sum(case when score = 30 then 0 else 1 end) over(order by id) as s
from t
)
select a.id, b.score
from x a
left join x b on (b.s = a.s - 1 and a.score <> 30 or b.s = a.s and a.score = 30)
and b.score <> 30
结果:
id score
--- -----
1 null
2 10
3 20
4 20
5 40
6 50
7 60
8 60
9 60
10 90
我确信有一种更干净的方法可以做到这一点,但我想不出任何方法。
请参阅 db<>fiddle 处的运行示例。