【问题标题】:How to reference output rows with window functions?如何使用窗口函数引用输出行?
【发布时间】:2016-01-06 18:36:49
【问题描述】:

假设我有一个带有quantity 列的表。

CREATE TABLE transfers (
  user_id integer,
  quantity integer,
  created timestamp default now()
);

我想使用窗口函数迭代地遍历分区,但访问输出行,而不是输入表行。

要访问输入表行,我可以这样做:

SELECT LAG(quantity, 1, 0)
  OVER (PARTITION BY user_id ORDER BY created)
FROM transfers;

我需要访问上一个输出行来计算下一个输出行。如何访问输出中的滞后行?比如:

CREATE VIEW balance AS
SELECT LAG(balance.total, 1, 0) + quantity AS total
  OVER (PARTITION BY user_id ORDER BY created)
FROM transfers;

编辑

这是一个支持如何访问窗口分区中的前一个输出行的最小示例。我其实不想要一个总和。

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    您似乎试图计算running sum。幸运的是,这正是 Sum() 窗口函数所做的:

    WITH transfers AS(
        SELECT i, random()-0.3 AS quantity  FROM generate_series(1,100) as i
    )
    SELECT i, quantity, sum(quantity) OVER (ORDER BY i) from transfers;
    

    【讨论】:

    • 这只是一个例子,我想在case语句和计算中使用之前的输出行。
    【解决方案2】:

    我想,看看这个问题,你唯一需要的就是计算一个累积和。
    要计算累积和,请使用以下查询:

    SELECT *,
          SUM( CASE WHEN quantity IS NULL THEN 0 ELSE quantity END) 
          OVER ( PARTITION BY user_id ORDER BY created
                 ROWS BETWEEN unbounded preceding AND current row
                  ) As cumulative_sum
    FROM transfers
    ORDER BY user_id, created
    ;
    

    但如果您想要更复杂的计算,尤其是包含一些依赖于前一行结果的条件(决策),那么您需要一种递归方法。

    【讨论】:

    • 是的,这只是一个例子,我需要做一些花哨的事情。
    猜你喜欢
    • 2017-08-14
    • 1970-01-01
    • 2021-03-16
    • 2021-03-01
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    相关资源
    最近更新 更多