Sql 如何将Oracle代码中max的使用转换为BigQuery

Sql 如何将Oracle代码中max的使用转换为BigQuery,sql,google-bigquery,Sql,Google Bigquery,如何将下面的Oracle代码转换为BigQuery max(to_date(BIC_GM_AGCPOAODS00_BO_VW.BOUND_DATE,'yyyymmdd')) 当我尝试此代码时: SELECT A._BIC_GCISBN, max(cast(A.BOUND_DATE as date),'yyyymmdd') FROM `BIC_GM_AGCPOAODS00_BO_VW` A WHERE A._BIC_ZC2GRIRIN = 'G' AND A._BIC_ZCLO

如何将下面的Oracle代码转换为BigQuery

max(to_date(BIC_GM_AGCPOAODS00_BO_VW.BOUND_DATE,'yyyymmdd'))
当我尝试此代码时:

SELECT A._BIC_GCISBN,
       max(cast(A.BOUND_DATE as date),'yyyymmdd')
FROM `BIC_GM_AGCPOAODS00_BO_VW`  A
WHERE A._BIC_ZC2GRIRIN  = 'G' AND A._BIC_ZCLOEKZ  = ' '  
GROUP BY A._BIC_GCISBN
我得到了错误信息:

参数类型:日期、字符串的聚合函数MAX没有匹配的签名。支持的签名:最多(任何)在[15:2]


在BigQuery中,您需要
parse_date()

您应该使用
date
存储值,但有时我们无法控制数据的存储方式

编辑:

根据您的数据格式,您也可以这样写:

SELECT A._BIC_GCISBN,
       PARSE_DATE('%Y%m%d', MAX(A.BOUND_DATE))
FROM `BIC_GM_AGCPOAODS00_BO_VW`A
WHERE A._BIC_ZC2GRIRIN  = 'G' AND A._BIC_ZCLOEKZ  = ' '  
GROUP BY A._BIC_GCISBN;

我更喜欢第一个版本,因为它很容易推广到任何数据格式。这可能更有效。

为什么要将日期值存储为
varchar
?那真是个糟糕的主意我不知道怎么储存。请帮我拿些东西solution@Tejash有人能帮我吗please@HereGoes有人能帮我吗?你认为使用
解析日期(“%Y%m%d',MAX(A.BOUND\u DATE))
会在性能/资源方面有所不同吗?@MikhailBerlyant。考虑到BQ查询固有的开销,如果有明显的差异,我会感到惊讶。问题是一个包含8个字符(10个字节)的字符串上的最大值是否比使用假定的二进制格式转换为8个字节快或慢。我不知道。但是,我知道首先解析更为普遍。无论日期格式如何,它都会起作用。我将尝试对此进行“研究”-如果有结果,我会分享:o)我们正在从按需利率转向统一利率,因此我现在的兴趣不仅仅是性能方面,而是时段方面。在大数据上运行这样的查询时,“插槽消耗”方面有什么区别scale@MikhailBerlyant . . . 如果像这样的标量函数会影响插槽,我会感到惊讶。基于成本的优化器通常不考虑标量函数;但是,同样,没有多少数据库可以进行动态分区。也许谷歌在这方面会很聪明。我们也要换吃角子老虎机了,所以我想我对答案很感兴趣。只是想澄清一下——这不是对这个答案的批评!一点也不!同时,刚刚做了非常快速的测试——对于执行时间约为1秒的相对简单的查询,平均测试时间为:
MAX(DATE())
DATE(MAX())
多消耗两倍的插槽,在这1秒内大约消耗1个插槽,而不是0.5个插槽——这也与执行计划一致。显然,对于单个查询来说,差异是可以忽略不计的。试图了解这种“差异”如何影响大规模统一费率使用的有效性。很可能不会太多,但希望对此有更好的了解。。。
SELECT A._BIC_GCISBN,
       PARSE_DATE('%Y%m%d', MAX(A.BOUND_DATE))
FROM `BIC_GM_AGCPOAODS00_BO_VW`A
WHERE A._BIC_ZC2GRIRIN  = 'G' AND A._BIC_ZCLOEKZ  = ' '  
GROUP BY A._BIC_GCISBN;