对 Snowflake 中的上一行和当前行值执行数学运算
Perform Math operations on previous and current row value in Snowflake
我有一个要求,我需要对 Snowflake 中列的先前值和当前值执行一些数学计算。
例如:
我的 Snowflake table 有如下数据
此处CHANGE_IN_FRUIT_COUNT和CHANGE_IN_VEG_COUNT字段计算如下
((current_val/previous_val)*100)-100
我也想在我的 table 中实现相同的逻辑。
使用 LAG:
SELECT DATE,
(FRUITS_SOLD / LAG(FRUITS_SOLD)
OVER(ORDER BY DATE))*100-100 AS CHANGE_IN_FRUIT_COUNT.
(VEGETABLE_SOLD / LAG(VEGETABLE_SOLD )
OVER(ORDER BY DATE))*100-100 AS CHANGE_IN_VEG_COUNT
FROM tab
ORDER BY DATE;
SELECT
date,
fruits_sold,
vegetable_sold,
lag(vegetable_sold) over (order by date) as prev_vegetable_sold,
lag(fruits_sold) over (order by date) as prev_fruits_sold,
((vegetable_sold/prev_vegetable_sold)*100)-100 as change_in_veg_count,
((fruits_sold/prev_fruits_sold)*100)-100 as change_in_fruit_count
FROM VALUES
('2022-01-01'::date, 18, 11)
,('2022-01-02'::date, 20, 16)
,('2022-01-03'::date, 25, 40)
,('2022-01-04'::date, 12, 14)
,('2022-01-05'::date, 18, 6)
d(date, fruits_sold, vegetable_sold);
给出:
DATE
FRUITS_SOLD
VEGETABLE_SOLD
PREV_VEGETABLE_SOLD
PREV_FRUITS_SOLD
CHANGE_IN_VEG_COUNT
CHANGE_IN_FRUIT_COUNT
2022-01-01
18
11
2022-01-02
20
16
11
18
45.4545
11.1111
2022-01-03
25
40
16
20
150
25
2022-01-04
12
14
40
25
-65
-52
2022-01-05
18
6
14
12
-57.1429
50
显示了如何使用 LAG 获取先验值。如果您真的不需要为其他事情重用该值,您可以将其捆绑到一行中,如 Lukasz 所示:
SELECT
date,
((vegetable_sold/lag(vegetable_sold) over (order by date))*100)-100 change_in_veg_count,
((fruits_sold/lag(fruits_sold) over (order by date))*100)-100 change_in_fruit_count
FROM VALUES
('2022-01-01'::date, 18, 11)
,('2022-01-02'::date, 20, 16)
,('2022-01-03'::date, 25, 40)
,('2022-01-04'::date, 12, 14)
,('2022-01-05'::date, 18, 6)
d(date, fruits_sold, vegetable_sold);
DATE
CHANGE_IN_VEG_COUNT
CHANGE_IN_FRUIT_COUNT
2022-01-01
2022-01-02
45.4545
11.1111
2022-01-03
150
25
2022-01-04
-65
-52
2022-01-05
-57.1429
50
我有一个要求,我需要对 Snowflake 中列的先前值和当前值执行一些数学计算。
例如:
我的 Snowflake table 有如下数据
此处CHANGE_IN_FRUIT_COUNT和CHANGE_IN_VEG_COUNT字段计算如下
((current_val/previous_val)*100)-100
我也想在我的 table 中实现相同的逻辑。
使用 LAG:
SELECT DATE,
(FRUITS_SOLD / LAG(FRUITS_SOLD)
OVER(ORDER BY DATE))*100-100 AS CHANGE_IN_FRUIT_COUNT.
(VEGETABLE_SOLD / LAG(VEGETABLE_SOLD )
OVER(ORDER BY DATE))*100-100 AS CHANGE_IN_VEG_COUNT
FROM tab
ORDER BY DATE;
SELECT
date,
fruits_sold,
vegetable_sold,
lag(vegetable_sold) over (order by date) as prev_vegetable_sold,
lag(fruits_sold) over (order by date) as prev_fruits_sold,
((vegetable_sold/prev_vegetable_sold)*100)-100 as change_in_veg_count,
((fruits_sold/prev_fruits_sold)*100)-100 as change_in_fruit_count
FROM VALUES
('2022-01-01'::date, 18, 11)
,('2022-01-02'::date, 20, 16)
,('2022-01-03'::date, 25, 40)
,('2022-01-04'::date, 12, 14)
,('2022-01-05'::date, 18, 6)
d(date, fruits_sold, vegetable_sold);
给出:
DATE | FRUITS_SOLD | VEGETABLE_SOLD | PREV_VEGETABLE_SOLD | PREV_FRUITS_SOLD | CHANGE_IN_VEG_COUNT | CHANGE_IN_FRUIT_COUNT |
---|---|---|---|---|---|---|
2022-01-01 | 18 | 11 | ||||
2022-01-02 | 20 | 16 | 11 | 18 | 45.4545 | 11.1111 |
2022-01-03 | 25 | 40 | 16 | 20 | 150 | 25 |
2022-01-04 | 12 | 14 | 40 | 25 | -65 | -52 |
2022-01-05 | 18 | 6 | 14 | 12 | -57.1429 | 50 |
显示了如何使用 LAG 获取先验值。如果您真的不需要为其他事情重用该值,您可以将其捆绑到一行中,如 Lukasz 所示:
SELECT
date,
((vegetable_sold/lag(vegetable_sold) over (order by date))*100)-100 change_in_veg_count,
((fruits_sold/lag(fruits_sold) over (order by date))*100)-100 change_in_fruit_count
FROM VALUES
('2022-01-01'::date, 18, 11)
,('2022-01-02'::date, 20, 16)
,('2022-01-03'::date, 25, 40)
,('2022-01-04'::date, 12, 14)
,('2022-01-05'::date, 18, 6)
d(date, fruits_sold, vegetable_sold);
DATE | CHANGE_IN_VEG_COUNT | CHANGE_IN_FRUIT_COUNT |
---|---|---|
2022-01-01 | ||
2022-01-02 | 45.4545 | 11.1111 |
2022-01-03 | 150 | 25 |
2022-01-04 | -65 | -52 |
2022-01-05 | -57.1429 | 50 |