具有顺序演算的 LAG 函数

LAG function with sequential calculus

我今天来找你是因为我正在努力处理涉及 LAG 函数的查询(仅供参考,我正在使用 PostgreSQL)。 我有一个 table,其中包含每月按国家/地区销售给另一个国家的产品数量。 table 定义如下:

create table market_research.test_tonnage(
    origin text, -- Origin country
    desti text, -- Destination country
    yr int, -- Year
    mt int, -- Month
    q numeric -- quantity sold (always > 0)
)

内容如下:

origin desti yr mt q
toto coucou 2019 1 1.4
toto coucou 2019 2 2.5
toto coucou 2019 3 1.2
tata yoyo 2018 11 5.4
tata yoyo 2018 12 5.5
tata yoyo 2019 1 5.2

我正在尝试创建一个将添加 2 个计算字段的视图,如下所示:

origin desti yr mt q beginning_stock ending_stock
toto coucou 2019 1 1.4 0 -1.4
toto coucou 2019 2 2.5 -1.4 -3.9
toto coucou 2019 3 1.2 -3.9 -5.1
tata yoyo 2018 11 5.4 0 -5.4
tata yoyo 2018 12 5.5 -5.4 -10.9
tata yoyo 2019 1 5.2 -10.9 -16.1

我使用 LAG 函数尝试了很多查询,但我认为问题出在演算随时间的顺序性。这是我尝试的一个例子:

select origin,
       desti,
       yr,
       mt,
       q,
       COALESCE(lag(ending_stock, 1) over (partition by origin order by yr, mt), 0) beginning_stock,
       beginning_stock - q ending_stock    
 from market_research.test_tonnage

感谢您的帮助! 最大值

您需要一个累积 SUM() 函数而不是 LAG():

demo:db<>fiddle

SELECT
    *,
    SUM(-q) OVER (PARTITION BY origin ORDER BY yr, mt) + q as beginning, -- 2
    SUM(-q) OVER (PARTITION BY origin ORDER BY yr, mt) as ending         -- 1
FROM my_table
  1. 对所有数量求和(因为你想要负值,当然你可以把之前的值设为负数)直到当前给你当前总数(ending
  2. 没有当前值的相同操作(再次添加 q,因为 SUM() 已经减去它)给出 beginning.