【问题标题】:Get column from first and last entry of grouping in Snowflake query从 Snowflake 查询中分组的第一个和最后一个条目中获取列
【发布时间】:2022-11-21 09:20:26
【问题描述】:

我正在尝试运行一个查询,从股票交易中获取 OHLC 统计信息。为此,我创建了以下查询:

SELECT 
    SUM(T.size), 
    SUM(T.size) / SUM(T.price), 
    FIRST_VALUE(T.price), 
    LAST_VALUE(T.price),
    MAX(T.price),
    MIN(T.price),
    FLOOR(T.sip_timestamp / 3600000000000)
FROM (
    SELECT *
    FROM trades AS T
    WHERE 
        T.symbol = 'NTAP' AND 
        T.sip_timestamp >= 1640995200000000000 AND
        T.sip_timestamp < 1672531200000000000
    ORDER BY T.sip_timestamp) AS T
GROUP BY FLOOR(T.sip_timestamp / 3600000000000)

这应该通过将交易数据过滤到时间戳窗口,按时间段(等于一小时)对其进行分组,然后据此计算统计数据来工作。成交量、加权值、最高价、最低价和开盘时间值很简单,但我无法生成开盘价和收盘价。我正在使用 FIRST_VALUELAST_VALUE 窗口函数,但我不确定如何使它们在分组上下文中工作。有谁知道如何在这里获得正确的结果?

【问题讨论】:

    标签: sql group-by snowflake-cloud-data-platform


    【解决方案1】:

    所以FIRST_VALUE和LAST_VALUE是窗框函数不是aggregate functions,因此不在GROUP BY的域中操作

    所以你想要做的是通过分区和 order by 子句定义 FIRST_VALUE 的范围,然后在 GROUP BY 中使用 ANY_VALUE

    因此:

    with trades(symbol, sip_timestamp, size, price) as (
        select * from values
            ('NTAP', 1640995200000000000, 100, 1.234),
            ('NTAP', 1640995200000000001, 100, 1.111)
    )
    SELECT 
        bucket,
        SUM(T.size), 
        SUM(T.size) / SUM(T.price), 
        ANY_VALUE(b_fv) as bucket_first_value, 
        ANY_VALUE(b_lv) as bucket_last_value, 
        MAX(T.price) as max_price,
        MIN(T.price) as min_price
    FROM (
        SELECT *
            ,FLOOR(T.sip_timestamp / 3600000000000) as bucket
            ,FIRST_VALUE(T.price) over (partition by bucket order by T.sip_timestamp) as b_fv
            ,LAST_VALUE(T.price) over (partition by bucket order by T.sip_timestamp) as b_lv 
        FROM trades AS T
        WHERE 
            T.symbol = 'NTAP' AND 
            T.sip_timestamp >= 1640995200000000000 AND
            T.sip_timestamp < 1672531200000000000
        ) AS T
    GROUP BY bucket
    

    现在给定你有一个子选择,我把 FIRST_VALUES/LAST_VALUE 放在那里,因为嵌套的窗口函数不能一起玩。

    我也把bucket 也放在那层。

    BUCKET SUM(T.SIZE) SUM(T.SIZE) / SUM(T.PRICE) BUCKET_FIRST_VALUE BUCKET_LAST_VALUE MAX_PRICE MIN_PRICE
    455,832 200 85.287846 1.234 1.111 1.234 1.111

    【讨论】:

    • 哇,我没想过那样做。优秀的解决方案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多