为 Greenplum 中的 table 列取消聚合

de-aggregate for table columns in 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

val 好像是一个累计数。您可以通过从当前 val 中减去之前的 val 来 "unaggregate" 它,例如,通过使用 lag 函数。请注意,您必须特别对待每个组中的第一个值,因为 lag 将 return null:

SELECT id, val - COALESCE(LAG(val) OVER (PARTITION BY id ORDER BY val), 0) AS val
FROM   mytable;

您可以只使用 LAG 函数:

SELECT id,
    val - lag(val, 1, 0) over (partition BY id ORDER BY val) as step
FROM yourTable

注意lag()有三个参数。第一个是查找滞后的列,第二个表示查看以前的记录,第三个将导致 lag 到 return 默认值为零。

这是一个 table 显示 table 此查询将生成的结果:

 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 子句。