【问题标题】:PosgreSQL Syntax conversion to snowflake - Issue with Group by ClausePostgreSQL 语法转换为雪花 - Group by Clause 问题
【发布时间】:2020-12-27 15:18:29
【问题描述】:

我正在尝试将 PostgreSQL sql 中的以下语法转换为雪花。转换为雪花后,它会抛出在 groupby 子句中添加快照的错误

PostgreSQL 查询

select row_number()
    over (
      order by snapshot_date )                                           AS month_no,
  *
from (
  SELECT
       date_trunc('month', snapshot_date) :: date                                AS month_date,
    MIN(snapshot_date)                                                        AS month_start,
    MAX(snapshot_date)                                                        AS month_end,
    MAX(snapshot_date)                                                        as snapshot_date,
    (date_trunc('month', snapshot_date) + INTERVAL '1 month - 1 day') :: DATE as eow,
    lag(MAX(snapshot_date), 1)
    over (
      order by
        date_trunc('month', snapshot_date) :: date   ) as prev_month_end
  FROM sample.sample
  WHERE snapshot_date >= ('2020-10-10')
   and snapshot_date < date_trunc('week', current_date)
   GROUP BY date_trunc('month', snapshot_date),
    EXTRACT(month FROM snapshot_date)
  ORDER BY 3 DESC
)a where month_end>('2020-10-10');

上面的查询返回3条记录

我正在使用下面的雪花查询。在执行时它要求添加快照日期,如果我添加它,它会在快照日期进行分组并返回 31 条记录。 所以简而言之,我不想按快照日期分组,因为它应该只按月份开始和月份数分组。

雪花查询

select row_number()
    over (
      order by snapshot_date )                                           AS month_no,
  *
from (
  SELECT
    
    date_trunc('month', snapshot_date :: date)                                AS month_date,
    MIN(snapshot_date)                                                        AS month_start,
    MAX(snapshot_date)                                                        AS month_end,
    MAX(snapshot_date)                                                        as snapshot_date,
    last_day(snapshot_date) as eow,
    lag(MAX(snapshot_date), 1)
    over (
      order by
        date_trunc('month', snapshot_date :: date)   ) as prev_month_end
  FROM fincor.fx_rate
  WHERE snapshot_date >= ('2020-10-10')
   and snapshot_date < date_trunc('week', current_date)
 
  GROUP BY date_trunc('month', snapshot_date),
    EXTRACT(month FROM snapshot_date)
  ORDER BY 3 DESC
)a where month_end>('2020-10-10');

错误

【问题讨论】:

  • 尝试将MAX(snapshot_date) 输出重命名为snapshot_date 以外的名称。我认为您在查询中引用多个具有相同名称的列可能会感到困惑。为什么你要按同一件事分组两次?最后,我很惊讶它没有抱怨子查询中的 ORDER BY 语句。
  • 我更新了查询但仍然有同样的问题。如果您可以分享您的更新查询版本,那将非常有帮助。
  • @MikeWalton,您能否分享您所指的更新查询版本?

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


【解决方案1】:

你得到的错误,可以通过添加“日期转换”来修复:

GROUP BY date_trunc('month', snapshot_date :: date )

当您添加“group by”时,“last_day(snapshot_date) as eow”也会导致错误,因为 SNAPSHOT_DATE 既不是聚合也不是 group by 子句。 SQL 语句的最终版本应该是这样的:

select  row_number()
    over (
      order by snapshot_date ) AS month_no, 
  *
from (
  SELECT
    date_trunc('month', snapshot_date :: date)                                AS month_date,
    MIN(snapshot_date)                                                        AS month_start,
    MAX(snapshot_date)                                                        AS month_end,
    MAX(snapshot_date)                                                        as snapshot_date,
    last_day(MAX(snapshot_date)) as eow,
    lag(MAX(snapshot_date), 1)
    over (
      order by
        date_trunc('month', snapshot_date :: date)   ) as prev_month_end 
  FROM fincor.fx_rate
  WHERE snapshot_date >= ('2020-10-10')
   and snapshot_date < date_trunc('week', current_date)
  GROUP BY date_trunc('month', snapshot_date :: date )
   , EXTRACT(month FROM snapshot_date)
  ORDER BY 3 DESC
) a where month_end > ('2020-10-10');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-13
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    • 2012-07-29
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    相关资源
    最近更新 更多