我有一个像这样的表
我正在做一些计算,在某些时候,当我在第2列中得到一个负数时,我必须找到该负数之前的第一个正数。例如,如果负数是-2.2,我想访问1.2,如果负数是-0.8,那么我想访问1.5。
我该怎么做?
谢谢。
答案 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)
将来,如果您将数据和预期的输出分别作为文本而不是图像添加,将会非常有帮助。