Postgres:特殊条件下的滞后和铅

时间:2013-12-16 11:00:59

标签: postgresql conditional-statements lag lead

原谅可能是一个愚蠢的问题,但我不是一个数据库专家。

这是我的表格

id_data | val_no3 | id_prev | id_next
--------+---------+---------+----------
1       |         |         | 2
2       |  7      |         | 
3       |         | 2       | 4
4       |  5      |         | 
5       |         | 4       | 10
6       |         | 4       | 10
7       |         | 4       | 10
8       |         | 4       | 10
9       |         | 4       | 10
10      |  8      | 4       | 

在下表中:

  • id_prev是val_no3为null时id_data的值

  • id_next是val_no3为null时id_data的值

现在我想拥有这个

id_data | val_no3 | id_prev | id_next  | val_prev | val_next
--------+---------+---------+----------+----------+----------
1       |         |         | 2        |          | 7 
2       |  7      |         |          |          |    
3       |         | 2       | 4        | 7        | 5
4       |  5      |         |          |          |
5       |         | 4       | 10       | 5        | 8
6       |         | 4       | 10       | 5        | 8
7       |         | 4       | 10       | 5        | 8
8       |         | 4       | 10       | 5        | 8
9       |         | 4       | 10       | 5        | 8
10      |  8      |         |          |          |

条件如下:

如果val_no3为null 则:val_prev和val_next必须为null

如果val_no3不为空则:

  • val_prev必须等于val_no3的先前值(如果前面的val_no3也为null,则它应为null)

  • val_next必须等于val_no3的以下值(如果val_no3也为null,那么它也应为null)


我想我可能不得不使用滞后和铅的东西,但我不知道该怎么做。

如果您能帮我解决这个问题,我将非常感激,谢谢。

1 个答案:

答案 0 :(得分:1)

不需要分析功能,只需要进行子选择。以下(未经测试)应该有效:

select
  id_data,
  val_no3,
  id_prev,
  id_next,
  (select val_no2 from b where id_data = x.id_prev) as val_prev,
  (select val_no2 from b where id_data = x.id_next) as val_next
from
  b x
order by
  id_data;