Sqlglot Snowflake 解析问题

问题描述 投票:0回答:1

输入SQL

WITH first_activity AS (
  SELECT USER_ID, MIN(TO_TIMESTAMP(EVENT_DATE)) AS first_activity_date
  FROM DF.USER_EVENTS
  GROUP BY USER_ID
)
SELECT COUNT(*) AS active_users_count
FROM first_activity
WHERE DATEDIFF(day, first_activity_date, CURRENT_TIMESTAMP()) > 90

我按以下方式使用 sqlglot 转换函数

sqlglot.transpile(query, write="snowflake", pretty=True)[0]

输出查询

WITH first_activity AS (
  SELECT
    USER_ID,
    MIN(TO_TIMESTAMP(EVENT_DATE)) AS first_activity_date
  FROM DF.USER_EVENTS
  GROUP BY
    USER_ID
)
SELECT
  COUNT(*) AS active_users_count
FROM first_activity
WHERE
  DATEDIFF(, first_activity_date, day) > 90

输出查询失败,因为 DATEDIFF 函数中有一个前导逗号。此外,我不确定为什么它完全改变了函数签名和参数。

我期待查询与一些漂亮的相同。

python-3.x snowflake-cloud-data-platform sqlglot
1个回答
0
投票

聚会有点晚了,但现在的一代(v25.3.4)可以正常工作:

>>> import sqlglot
>>> sqlglot.transpile("""
... WITH first_activity AS (
...   SELECT USER_ID, MIN(TO_TIMESTAMP(EVENT_DATE)) AS first_activity_date
...   FROM DF.USER_EVENTS
...   GROUP BY USER_ID
... )
... SELECT COUNT(*) AS active_users_count
... FROM first_activity
... WHERE DATEDIFF(day, first_activity_date, CURRENT_TIMESTAMP()) > 90
... """, "snowflake")
['WITH first_activity AS (SELECT USER_ID, MIN(TO_TIMESTAMP(EVENT_DATE)) AS first_activity_date FROM DF.USER_EVENTS GROUP BY USER_ID) SELECT COUNT(*) AS active_users_count FROM first_activity WHERE DATEDIFF(DAY, first_activity_date, CURRENT_TIMESTAMP()) > 90']
© www.soinside.com 2019 - 2024. All rights reserved.