具有顺序演算的 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 个计算字段的视图,如下所示:
- beginning_stock : 初始值为0,则上个月的beginning_stock = ending_stock
- ending_stock : ending_stock = beginning_stock - q
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()
:
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
- 对所有数量求和(因为你想要负值,当然你可以把之前的值设为负数)直到当前给你当前总数(
ending
)
- 没有当前值的相同操作(再次添加
q
,因为 SUM()
已经减去它)给出 beginning
.
我今天来找你是因为我正在努力处理涉及 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 个计算字段的视图,如下所示:
- beginning_stock : 初始值为0,则上个月的beginning_stock = ending_stock
- ending_stock : ending_stock = beginning_stock - q
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()
:
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
- 对所有数量求和(因为你想要负值,当然你可以把之前的值设为负数)直到当前给你当前总数(
ending
) - 没有当前值的相同操作(再次添加
q
,因为SUM()
已经减去它)给出beginning
.