在Greenplum中对表列进行解聚合

时间:2016-06-10 09:54:35

标签: postgresql aggregate greenplum

我正在使用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

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;