【问题标题】:de-aggregate for table columns in GreenplumGreenplum 中表列的去聚合
【发布时间】:2016-06-10 09:54:34
【问题描述】:

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

【问题讨论】:

    标签: postgresql aggregate greenplum


    【解决方案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 子句。

    【讨论】:

    • 谢谢,这真的很有帮助。并且比我计划做的更容易。
    • 是的,相信我,我也松了一口气,LAG 可以开箱即用。
    【解决方案2】:

    val 似乎是一个累积和。您可以通过从当前 val 中减去前一个 val 来“取消聚合”它,例如,通过使用 lag 函数。请注意,您必须特别对待每个组中的第一个值,因为 lag 将返回 null

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

    【讨论】:

      猜你喜欢
      • 2019-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-04
      • 2021-03-23
      • 1970-01-01
      • 1970-01-01
      • 2015-02-12
      相关资源
      最近更新 更多