如何使用标准 SQL (BigQuery) 与几个月不同

Posted

技术标签:

【中文标题】如何使用标准 SQL (BigQuery) 与几个月不同【英文标题】:How do I make that difference from months using standardSQL (BigQuery) 【发布时间】:2018-07-20 14:31:13 【问题描述】:

我有以下疑问:

#standardSQL
SELECT distinct  (grand_total/months) AS avg, ((grand_total/days)) AS 
avg_day
FROM 
(select count(searchint.id) as Total, (DATE_DIFF(DATE (DATE_END), 
DATE (DATE_START), DAY)+1) AS days, ((12 * YEAR(TIMESTAMP(DATE_END)) + 
MONTH(TIMESTAMP(DATE_END))) - (12 * YEAR(TIMESTAMP(DATE_START)) 
+ MONTH(TIMESTAMP(DATE_START))) +1) AS months,
(select count(searchint.id) as Total
from `dbsearch`
where  cast(replace(searchint.createdDate,'Z','')as DateTime) >= 
cast(DATE_START as DateTime)
and  cast(replace(searchint.createdDate,'Z','')as DateTime) <= 
cast(DATE_ADD(cast(DATE_END as date),  Interval 1 day ) as DateTime)) AS grand_total
    from `dbsearch`
where  cast(replace(searchint.createdDate,'Z','')as DateTime) >= 
cast(DATE_START as DateTime)
and  cast(replace(searchint.createdDate,'Z','')as DateTime) <= 
cast(DATE_ADD(cast(DATE_END as date),  Interval 1 day ) as DateTime)
group by date(cast(replace(searchint.createdDate,'Z','')as DateTime))
ORDER BY 2 DESC) AS groupby

但是,当我尝试运行 BigQuery 时,会出现以下错误:

未找到函数:YEAR 在 [5:180]

我知道这是因为我使用的是标准 SQL,但是如何与使用标准 SQL 的几个月有所不同?

【问题讨论】:

【参考方案1】:

要查找两个日期之间的月份差异,您最好使用DATE_DIFF()

DATE_DIFF(DATE_END, DATE_START, MONTH)

【讨论】:

【参考方案2】:

BigQuery 中的 StandardSQL 支持用于提取日期部分的 ISO/ANSI 标准函数。这是extract()

你想要:

extract(year from <datecol>)
extract(month from <datecol>)

这在documentation中有解释。

【讨论】:

以上是关于如何使用标准 SQL (BigQuery) 与几个月不同的主要内容,如果未能解决你的问题,请参考以下文章

如何使用标准 SQL 在 BigQuery 中透视表?

定位与几个常用的属性

Bigquery/标准 SQL:如何使用 sum() 聚合所有列(大约 100 列)?

BigQuery 标准 SQL 如何将行转换为列

如何使用 Java API 使用标准 SQL 创建 BigQuery 视图?

BigQuery:如何在 C# 中启用标准 SQL