Postgres查询它回复的数字是最后一个不同的值

时间:2016-10-17 20:58:26

标签: sql postgresql

我想查询当前行中哪个回复的最后一个不同值行号。 NUMBER只有2个值。

表A给出

ROWNUM NUMBER
1      1        
2      1        
3      1        
4      1        
5     -1        
6     -1        
7      1        
8      1        
9     -1  
10     -1 
11     -1 
某些查询

表A的预期结果。

ROWNUM NUMBER LASTDIFFERENT
1      1        5
2      1        4
3      1        3
4      1        2
5     -1        3
6     -1        2
7      1        3
8      1        2
9     -1  
10     -1 
11     -1 

1 个答案:

答案 0 :(得分:0)

这可能属于"只是因为你并不意味着你应该这样做。"我没有看到任何优雅的问题解决方案,但这是一个有效的解决方案,至少对于您的示例数据而言:

with switches as(
  select
    rownum, number,
    case
      when lag(number) over (order by rownum) = number then 0
      else 1
    end switch
  from TableA
),
groups as (
  select
    rownum, number, sum (switch) over (order by rownum) group_id
  from switches
)
select
  rownum, number, -- group_id,
  max (rownum) over (partition by group_id) - rownum + 2 as last_different
from groups

我在你的样本数据上运行了这个并得到了这些结果:

rownum  number  last_different
1       1       5
2       1       4
3       1       3
4       1       2
5      -1       3
6      -1       2
7       1       3
8       1       2
9      -1       4
10     -1       3
11     -1       2