【问题标题】:Postgres : lag and lead with special conditionsPostgres:在特殊条件下滞后和领先
【发布时间】: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_previd_next 而是派生它们。

标签: postgresql conditional-statements lag lead


【解决方案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;

【讨论】:

  • 太棒了!非常感谢科林 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
  • 2021-06-04
相关资源
最近更新 更多