我正在尝试将旧版SQL查询转换为标准SQL。我的问题是用标准中的合适函数替换MONTH()。我阅读了文档和EXTRACT()似乎是解决方案,但我认为BigQuery中的日期字段是一个字符串,这使得它无法正常工作。
这是我的遗产代码:
SELECT month(date) AS Mon, hits.eventInfo.eventAction, ROUND(AVG(hits.product.productPrice/1000000),2) AS avg_price
FROM (TABLE_DATE_RANGE([xxx.ga_sessions_], DATE_ADD(CURRENT_TIMESTAMP(), -7, 'DAY'), DATE_ADD(CURRENT_TIMESTAMP(), -1, 'DAY')))
WHERE hits.eventInfo.eventCategory = "Ecommerce"
AND hits.eventInfo.eventAction = "Add to Basket PDP"
OR hits.eventInfo.eventAction = "Add to Basket PLP"
GROUP BY Mon_of_year, hits.eventInfo.eventAction
这是我的标准代码,我试图解决此问题:
SELECT extract(YEAR from PARSE_DATE('%y%m%d',date)) AS Mon, hits.eventInfo.eventAction, ROUND(AVG(hits_product.productPrice/1000000),2) AS avg_price
FROM
`xxx.ga_sessions_20*` AS t
CROSS JOIN UNNEST(hits) AS hits
CROSS JOIN UNNEST(hits.product) AS hits_product
WHERE
parse_DATE('%y%m%d',
_table_suffix) BETWEEN DATE_sub(CURRENT_DATE(),
interval 7 day)
AND DATE_sub(CURRENT_DATE(),
interval 1 day)
AND hits.eventInfo.eventCategory = "Ecommerce"
AND hits.eventInfo.eventAction = "Add to Basket PDP"
OR hits.eventInfo.eventAction = "Add to Basket PLP"
GROUP BY mon, hits.eventInfo.eventAction
但是这给了我错误:
Error: Failed to parse input string "20170304"
有关如何使其正常工作的任何建议吗?
答案 0 :(得分:4)
看起来你很接近,但你需要使用大写Y
而不是小写y
作为年份部分,即:
PARSE_DATE('%Y%m%d', date)
如果您想获取月份编号,可以使用EXTRACT(MONTH FROM ...)
,或者如果您只想将日期截断为月份边界,则可以使用DATE_TRUNC(..., MONTH)
。