为 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
子句。
我正在使用 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
子句。