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 【问题描述】:当我尝试减去时间戳并执行窗口函数(lead
、lag
和 partition 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 SQL 编译错误:位置 XX 处的语法错误行 XX 意外 '('
SQL 编译错误:无法在 Snowflake 中评估不受支持的子查询类型