【问题标题】:Convert CONCAT from SQLServer to Redshift将 CONCAT 从 SQL Server 转换为 Redshift
【发布时间】:2019-02-10 10:00:07
【问题描述】:

我在 MSSQL 服务器上有需要转换为 Redshift 的脚本

这是其中的一部分

  CROSS JOIN (
SELECT        MONTH(be.TimeWorkedFrom) AS MONTH,
                YEAR(be.TimeWorkedFrom) AS YEAR,
                CONCAT(DATEPART(MONTH, be.TimeWorkedFrom),'/',1,'/',DATEPART(YEAR, be.TimeWorkedFrom))AS MonthBilled
FROM            BE2_Billing_Entries be

WHERE           be.TimeWorkedFrom > '1/1/2015'
                AND be.ProviderId = 65277

GROUP BY        MONTH(be.TimeWorkedFrom),
                YEAR(be.TimeWorkedFrom),
                CONCAT(DATEPART(MONTH, be.TimeWorkedFrom),'/',1,'/',DATEPART(YEAR, be.TimeWorkedFrom))
                )t

我是这样重写的

  CROSS JOIN (
SELECT          DATE_TRUNC('MONTH',be.timeworkedfrom) AS MONTH,
                DATE_TRUNC('YEAR',be.timeworkedfrom) AS YEAR,
                CONCAT(DATE_PART('MONTH', be.timeworkedfrom),'/',1,'/',DATE_PART('YEAR', be.timeworkedfrom))AS MonthBilled
FROM            billing_entries be

WHERE           be.timeworkedfrom > '1/1/2015'
                AND be.providerid = 65277

GROUP BY        DATE_TRUNC('MONTH',be.timeworkedfrom),
                DATE_TRUNC('MONTH',be.timeworkedfrom),
                CONCAT(DATE_PART('MONTH', be.timeworkedfrom),'/',1,'/',DATE_PART('YEAR', be.timeworkedfrom))
                )t

但现在我得到错误

[42883][500310] Amazon 无效操作:函数 concat(double precision, "unknown", integer, "unknown", double precision) 不存在; java.lang.RuntimeException: com.amazon.support.exceptions.ErrorException: Amazon Invalid operation: function concat(double precision, "unknown", integer, "unknown", double precision) 不存在;

我的问题可能出在哪里?

【问题讨论】:

  • 通常你不应该在查询中使用CONCAT,因为这是一个视图级别的问题(并且单独的数据值应该以其原始数据类型返回给客户端)。您是否有理由需要在 SQL 中而不是在您的应用程序中执行 CONCAT?我还注意到,在 GROUP BY 中使用 CONCAT 并不能提供最佳性能(并且在您的示例中没有必要,因为您已经在 @987654328 中使用了两个基础值(来自 TimeWorkedFrom 的月份和年份) @无论如何。

标签: sql sql-server amazon-redshift


【解决方案1】:

使用 || (串联)操作符——redshift支持这个操作符或者嵌套 concat - 供您参考https://docs.aws.amazon.com/redshift/latest/dg/r_concat_op.html

CROSS JOIN (
SELECT          DATE_TRUNC('MONTH',be.timeworkedfrom) AS MONTH,
                DATE_TRUNC('YEAR',be.timeworkedfrom) AS YEAR,
                DATE_PART('MONTH', be.timeworkedfrom)||'/'||1||'/'||DATE_PART('YEAR', be.timeworkedfrom) AS MonthBilled
FROM            billing_entries be

WHERE           be.timeworkedfrom > '1/1/2015'
                AND be.providerid = 65277

GROUP BY        DATE_TRUNC('MONTH',be.timeworkedfrom),
                DATE_TRUNC('MONTH',be.timeworkedfrom),
                DATE_PART('MONTH', be.timeworkedfrom)||'/'||1||'/'||DATE_PART('YEAR', be.timeworkedfrom)

【讨论】:

  • 嗯。现在我收到此错误Invalid operation: column "be.timeworkedfrom" must appear in the GROUP BY clause or be used in an aggregate function;
  • 但是,我该怎么做呢?我在 sql 中更新
  • 在 group by 子句中使用该列,例如 GROUP BY DATE_TRUNC('MONTH',be.timeworkedfrom), DATE_TRUNC('MONTH',be.timeworkedfrom), DATE_PART('MONTH', be.timeworkedfrom) ||'/'||1||'/'||DATE_PART('YEAR', be.timeworkedfrom), be.timeworkedfrom
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-28
  • 2020-12-28
相关资源
最近更新 更多