【发布时间】:2013-12-16 11:00:59
【问题描述】:
请原谅可能是个愚蠢的问题,但我不是数据库专家。
这是我的桌子:
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 为空时前面的 id_data 的值
id_next 是 val_no3 为空时的 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 为空,则:val_prev 和 val_next 必须为空
如果 val_no3 不为空,那么:
val_prev 必须等于 val_no3 的前一个值(如果前面的 val_no3 也为 null,则它应该为 null)
val_next 必须等于 val_no3 的以下值(如果后面的 val_no3 也为 null,则它应该为 null)
我想我可能不得不使用滞后和领先的东西,但我不知道该怎么做。
如果您能帮我解决这个问题,我将不胜感激,谢谢。
【问题讨论】:
-
你试过什么?
-
我试过了,但结果不好: SELECT id_data,val_no3 , LAG(val_no3) OVER () , LEAD(val_no3) OVER () FROM b order by id_data 我看看应该是什么逻辑应用程序,但我不知道如何在 SQL postgres 中编写它。
-
你应该在你的问题上发布你的尝试。
-
注意我不会存储
id_prev和id_next而是派生它们。
标签: postgresql conditional-statements lag lead