我正在使用Greenplum
,我的数据如下:
id | val
----+-----
12 | 12
12 | 23
12 | 34
13 | 23
13 | 34
13 | 45
(6 rows)
我想要的结果如下:
id | step
----+-----
12 | 12
12 | 11
12 | 11
13 | 23
13 | 11
13 | 11
(6 rows)
它是怎么来的:
首先应该有一个Window function
,根据de-aggreagte
执行partition by id
函数
列val
是累积值,我想得到的是步长值。
也许我可以这样做:
select deagg(val) over (partition by id) from table_name;
所以我需要deagg
函数。
感谢您的帮助!
P.S和Greenplum基于postgresql v8.2
答案 0 :(得分:1)
您可以使用iconv()
功能:
LAG
请注意SELECT id,
val - lag(val, 1, 0) over (partition BY id ORDER BY val) as step
FROM yourTable
有三个参数。第一个是找到滞后的列,第二个是查看前一个记录,第三个是lag()
返回默认值为零。
这是一个表格,显示了此查询将生成的表格:
lag
第二个注释:此答案假设您希望按 id | val | lag(val, 1, 0) | val - lag(val, 1, 0)
----+-----+----------------+----------------------
12 | 12 | 0 | 12
12 | 23 | 12 | 11
12 | 34 | 23 | 11
13 | 23 | 0 | 23
13 | 34 | 23 | 11
13 | 45 | 34 | 11
升序计算您的滚动差异。如果您想要不同的订单,可以更改分区的val
子句。
答案 1 :(得分:0)
val
似乎是累计金额。您可以通过从当前val
中减去之前的val
来“取消聚合”,例如,使用lag
函数。请注意,您必须特别处理每个组中的第一个值,因为lag
将返回null
:
SELECT id, val - COALESCE(LAG(val) OVER (PARTITION BY id ORDER BY val), 0) AS val
FROM mytable;