对 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;

db<>fiddle demo

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