首页 > 解决方案 > Postgres中负数之前的第一个正数的行?

问题描述

我有一张像这样的桌子:

在此处输入图像描述

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

我怎样才能做到这一点?

谢谢。

标签: sqlpostgresql

解决方案


您可以使用窗口函数的组合来执行此操作。首先,使用count作为窗口函数,仅当column2>0时才增加count。这会将您的行分成您需要挑选正值的组。然后我们可以使用 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)

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


推荐阅读