You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Snowflake中替代RANGE BETWEEN INTERVAL的区间交易计数方案问询

Snowflake计算3天内客户交易计数的解决方案

需求说明

需要为每条交易记录计算Desired_Output列,规则为:同一客户,当前交易时间往前推2天(含当前时间)范围内的所有交易数量。示例中第一条记录的12,就是客户100在3/13至3/15(含)期间的所有交易总数。

示例数据

Customerid  txn_timestamp   txn_date    txn_id  Desired_Output
100     3/15/24 5:00 PM     15-Mar      100     12
100     3/15/24 4:00 PM     15-Mar      200     11
100     3/15/24 3:00 PM     15-Mar      300     10
100     3/15/24 2:00 PM     15-Mar      400      9
100     3/14/24 5:00 PM     14-Mar      500     10
100     3/14/24 4:00 PM     14-Mar      600      9
100     3/14/24 3:00 PM     14-Mar      700      8
100     3/14/24 2:00 PM     14-Mar      800      7
100     3/14/24 1:00 PM     14-Mar      900      6
100     3/14/24 12:00 PM    14-Mar      1000     5
100     3/13/24 5:00 PM     13-Mar      1100     7
100     3/13/24 4:00 PM     13-Mar      1200     6
100     3/12/24 5:00 PM     12-Mar      1300    
100     3/12/24 4:00 PM     12-Mar      1400    
100     3/11/24 5:00 PM     11-Mar      1500    
100     3/11/24 4:00 PM     11-Mar      1600    
100     3/11/24 3:00 PM     11-Mar      1700

已尝试的失效方法

  • 窗口函数写法(Snowflake中未生效):
    count(txn_id) over (partition by Customerid order by txn_timestamp range between interval '2' DAY PRECEDING and CURRENT ROW) as calc
    
  • 自连接子查询(字段名不匹配、逻辑有疏漏):
    select customerid, tran_id, count(*) 
    from ( 
       Select a.* from tbl1 a 
       join tbl1 b 
           on a.customerid = b.customerid 
         and (b.tran_tms between date(a.txn_tms)-2 and a.txn_tms) 
       )
    group by 1,2
    

有效解决方案

方案1:修正窗口函数写法

确保txn_timestamp为TIMESTAMP类型(若为字符串需先转换),使用符合Snowflake语法的窗口函数:

SELECT
    Customerid,
    txn_timestamp,
    txn_date,
    txn_id,
    COUNT(txn_id) OVER (
        PARTITION BY Customerid
        ORDER BY txn_timestamp
        RANGE BETWEEN INTERVAL '2 DAY' PRECEDING AND CURRENT ROW
    ) AS Desired_Output
FROM tbl1
ORDER BY txn_timestamp DESC;

若txn_timestamp是字符串类型,需先转换:TO_TIMESTAMP(txn_timestamp, 'MM/DD/YY HH:MI PM')

方案2:修正自连接逻辑

通过左连接匹配时间范围内的交易,统计计数:

SELECT
    a.Customerid,
    a.txn_timestamp,
    a.txn_date,
    a.txn_id,
    COUNT(b.txn_id) AS Desired_Output
FROM tbl1 a
LEFT JOIN tbl1 b
    ON a.Customerid = b.Customerid
    AND b.txn_timestamp BETWEEN DATEADD(DAY, -2, a.txn_timestamp) AND a.txn_timestamp
GROUP BY a.Customerid, a.txn_timestamp, a.txn_date, a.txn_id
ORDER BY a.txn_timestamp DESC;

该方法兼容性强,无需依赖窗口函数的RANGE INTERVAL特性,适合复杂时间范围场景。

内容的提问来源于stack exchange,提问作者sparkstars

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 20:14:51