Postgres中第一个正数在负数之前的行?

时间:2019-11-11 12:43:29

标签: sql postgresql

我有一个像这样的表

enter image description here

我正在做一些计算,在某些时候,当我在第2列中得到一个负数时,我必须找到该负数之前的第一个正数。例如,如果负数是-2.2,我想访问1.2,如果负数是-0.8,那么我想访问1.5。

我该怎么做?

谢谢。

1 个答案:

答案 0 :(得分:1)

您可以结合使用窗口功能来执行此操作。首先,将count用作窗口函数,仅当column2> 0时才递增计数。这会将您的行分为几组,以选择正值。然后,我们可以使用first_value从分区中获取第一行,该行将为正值:

create table test (column1 int, column2 numeric, column3 date);
insert into test VALUES (30, 2.5, '2019-01-01'), (31, 1.5, '2019-01-02'), (28, -0.8, '2019-01-03'), (29, 1.0, '2019-01-04'), (30, 1.2, '2019-01-05'), (38, -2.1, '2019-01-06'), (37, -2.2, '2019-01-07');


SELECT column1,
       column2,
       first_value(column2) OVER (PARTITION BY col2_group ORDER BY column3)
  FROM (
  select column1, 
         column2, 
         -- Create groups of rows
         count(column2) FILTER (WHERE column2>0) OVER(ORDER BY column3) as col2_group, 
         column3
  FROM test) as sub
ORDER BY column3
;
 column1 | column2 | first_value
---------+---------+-------------
      30 |     2.5 |         2.5
      31 |     1.5 |         1.5
      28 |    -0.8 |         1.5
      29 |     1.0 |         1.0
      30 |     1.2 |         1.2
      38 |    -2.1 |         1.2
      37 |    -2.2 |         1.2
(7 rows)

将来,如果您将数据和预期的输出分别作为文本而不是图像添加,将会非常有帮助。