2016-06-10 167 views
2

我使用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,根据partition by id执行de-aggreagte函数

val是累积值,我想得到的是步数值。

也许我能做到这一点,如:

select deagg(val) over (partition by id) from table_name; 

所以我需要deagg功能。

感谢您的帮助!

P.S和Greenplum的基于PostgreSQL的V8.2

回答

1

您可以只使用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升序的顺序滚动的差异。如果您想要一个不同的订单,您可以更改分区的ORDER BY子句。

+0

谢谢,这是真正有用的。比我打算做的更容易。 – cinqS

+0

是的,相信我,我也感到欣慰的是''LAG'可以在盒子里使用。 –

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;