sql - Postgres中负数之前的第一个正数的行?
问题描述
我有一张像这样的桌子:
我正在做一些计算,当我在第 2 列中得到一个负数时,我必须找到这个负数之前的第一个正数。例如,如果负数是-2.2,我想访问1.2,如果是-0.8,那么我想访问1.5。
我怎样才能做到这一点?
谢谢。
解决方案
您可以使用窗口函数的组合来执行此操作。首先,使用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)
将来,如果您将数据和预期输出分别添加为文本而不是图像,这将非常有帮助。
推荐阅读
- vue.js - Vue - 将 v-for 中具有相同键名的父数据传递给子组件
- spring - 春季抛出CannotCreateTransactionException
- php - 通过 Angular 6 将查询字符串中的数组发送到 PHP
- laravel - {closure}() 必须是 laravel 工厂种子上的 Faker\Generator\Generator 实例
- filereader - 浏览器控制台在 'FileReader' 上显示 readAsBinaryString':参数 1 不是 'Blob' 类型
- android - 如何使用 FusedLocationProviderClient 获取准确的位置(纬度和经度)
- java - 服务器应用程序挂起 Java socket 编程
- html - 如何去除按钮的底部空间?
- android - Ionic 3 对生产是否可靠?
- javascript - polymer-webpack-loader:如何导入和转译 Polymer .html 模板