Postgresql - 如果使用腿窗口函数满足特定值,如何跳过上一行

问题描述 投票:0回答:1

这是我的样本数据

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 排序)..不走运

sql postgresql
1个回答
0
投票

你可以这样做:

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 处的运行示例。

© www.soinside.com 2019 - 2024. All rights reserved.