Snowflake SQL 错误 - 函数“-”的参数类型无效:(TIMESTAMP_NTZ(9), TIMESTAMP_NTZ(9))

Posted

技术标签:

【中文标题】Snowflake SQL 错误 - 函数“-”的参数类型无效:(TIMESTAMP_NTZ(9), TIMESTAMP_NTZ(9))【英文标题】:Snowflake SQL error - Invalid argument types for function '-': (TIMESTAMP_NTZ(9), TIMESTAMP_NTZ(9)) 【发布时间】:2019-10-07 19:42:22 【问题描述】:

当我尝试减去时间戳并执行窗口函数(leadlagpartition by)时出现此错误:

函数“-”的参数类型无效:(TIMESTAMP_NTZ(9), TIMESTAMP_NTZ(9))

试过date_diff,但不能和窗口函数一起工作

SELECT 
   user_id,
   event,
   received_at,
   received_at - LAG( received_at,1) OVER (PARTITION BY user_id ORDER BY received_at) AS last_event
FROM 
   segment_javascript.help_center_opened

【问题讨论】:

【参考方案1】:

您不能通过仅减去两个日期来获得数字来执行“Oracle 方式”,您必须使用具有度量单位/比例的 diff 函数,例如:

SELECT 
   ts, 
   TIMESTAMPDIFF(MILLISECONDS, LAG(ts, 1) OVER (ORDER BY ts), ts) tsd
FROM 
   (VALUES (CURRENT_TIMESTAMP), (DATEADD(DAY, 1, CURRENT_TIMESTAMP))) v(ts);

【讨论】:

我倾向于使用 DATEDIFF,因为它们的功能相同,但 DATEDIFF 更短docs.snowflake.net/manuals/sql-reference/functions/…【参考方案2】:

我想您需要计算相同 user_id 与上次事件接收时间的时差。

如果是这样,我认为这会起作用:

SELECT 
   user_id,
   event,
   received_at,
   DATEDIFF(
     MINUTE, -- or any other supported date/time part
     received_at, -- start time 
     LAG( received_at,1) OVER (PARTITION BY user_id ORDER BY received_at) -- end time
     ) AS last_event
FROM 
   segment_javascript.help_center_opened

【讨论】:

以上是关于Snowflake SQL 错误 - 函数“-”的参数类型无效:(TIMESTAMP_NTZ(9), TIMESTAMP_NTZ(9))的主要内容,如果未能解决你的问题,请参考以下文章

如何克服 Snowflake SQL UDTF 相关子查询错误?

Snowflake 中的返回类型“Table”问题

Snowflake SQL 编译错误:位置 XX 处的语法错误行 XX 意外 '('

SQL 编译错误:无法在 Snowflake 中评估不受支持的子查询类型

将 CSV 文件从 S3 加载到 Snowflake 时出现 SQL 编译错误

snowflake-sql:min vs first_value windows函数的情况