0

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

这是我的桌子

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)


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

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

4

1 回答 1

2

不需要分析函数,只需子选择。类似以下(未经测试)的东西应该可以工作:

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;
于 2013-12-16T13:05:43.770 回答