【问题标题】:Issues when using DATE_DIFF with MAX(DATE)将 DATE_DIFF 与 MAX(DATE) 一起使用时的问题
【发布时间】:2017-11-23 08:14:23
【问题描述】:

我正在 BigQuery 中处理 Google Analytics 数据,我正在尝试计算 IF(COUNT(DISTINCT hits.transaction.transactionId) > 0,(MAX(DATE))CURRENT_DATE() 之间的 DATE_DIFF,但我收到了错误:

错误:对于参数类型的函数 IF 没有匹配的签名:BOOL、STRUCT。支持的签名:IF(BOOL, ANY, ANY) 在 [12:11]

这是什么意思? IF 的两个部分是否必须是同一类型?我似乎也出现了类似的错误,表明 MAX(DATE) 是一个字符串,所以我尝试了:

DATE_DIFF(IF(COUNT(DISTINCT hits.transaction.transactionId) > 0, PARSE_DATE('%Y%m%d',(MAX(DATE)),CURRENT_DATE())),CURRENT_DATE(),DAY) AS days_since_lst_ord

然后我得到:

错误:对于参数类型:STRING、STRING、DATE,函数 PARSE_DATE 没有匹配的签名。支持的签名:PARSE_DATE(STRING, STRING) 在 [12:66]

这是我的完整查询:

SELECT customDimension.value AS UserID, COUNT(DISTINCT VisitId) AS visits, COUNT(DISTINCT hits.transaction.transactionId) AS orders, IFNULL(SUM(totals.bounces),0) AS bounces, SUM(totals.pageviews) AS pageviews, IFNULL(SUM(hits.transaction.transactionRevenue)/1000000,0) AS revenue,
ROUND(IFNULL(COUNT(DISTINCT hits.transaction.transactionId)/COUNT(DISTINCT VisitId),0),5) AS conversion_rate,
ROUND(IFNULL(SUM(totals.bounces)/COUNT(DISTINCT VisitId),0),5) AS bounce_rate,   ROUND(IFNULL(SUM(hits.transaction.transactionRevenue)/1000000,0)/COUNT(DISTINCT VisitId),2) AS rev_per_visit,
IF(COUNT(DISTINCT hits.transaction.transactionId) > 0,(MAX(DATE)),"unknown") AS last_ord_date,
DATE_DIFF(IF(COUNT(DISTINCT hits.transaction.transactionId) > 0, PARSE_DATE('%Y%m%d',(MAX(DATE)),CURRENT_DATE())),CURRENT_DATE(),DAY) AS days_since_lst_ord
FROM `PROJECTNAME.ga_sessions_20*` AS t
  CROSS JOIN UNNEST (hits) AS hits
  CROSS JOIN UNNEST(t.customdimensions) AS customDimension
WHERE parse_date('%y%m%d', _table_suffix) between
DATE_sub(current_date(), interval 1 day) and
DATE_sub(current_date(), interval 1 day)
AND customDimension.index = 2
AND customDimension.value NOT LIKE "true"
AND customDimension.value NOT LIKE "false"
AND customDimension.value NOT LIKE "undefined"
AND customDimension.value IS NOT NULL
GROUP BY UserID, hits.eventInfo.eventCategory
Order by orders DESC

【问题讨论】:

  • 尝试格式化您的查询并查看结果...我认为问题在于您没有将括号排列在您认为应该在的位置。这个表达式没有意义,例如:PARSE_DATE('%Y%m%d',(MAX(DATE)),CURRENT_DATE()).
  • 我会试试这个,但我不确定PARSE_DATE 是否是正确的方法。我不应该只能够从MAX(DATE) 计算出DATE_DIFF 吗?

标签: sql google-bigquery


【解决方案1】:
Error: No matching signature for function IF for argument types: BOOL, STRUCT. 
Supported signature: IF(BOOL, ANY, ANY) at [12:11]    

这是什么意思? IF 的两个部分是否必须是同一类型?

true_result 和 else_result 表达式都必须强制转换为通用超类型。

例如,下面将不起作用

SELECT IF(true, 1, '1.1')

而这个 - 将完美地工作

SELECT IF(true, 1, 1.1)   

请注意,最后一条语句的结果将是 1.0 (FLOAT)

同时,如果你在下面运行 - 结果将是 1 (INTEGER)

SELECT IF(true, 1, 2)   

查看更多关于Coercion

【讨论】:

    【解决方案2】:

    你能用这个替换 last_ord_datedays_since_lst_ord 吗?

    IF(COUNT(DISTINCT hits.transaction.transactionId) > 0, (MAX(DATE)) ,"unknown") AS last_ord_date,
    
    DATE_DIFF(IF(COUNT(DISTINCT hits.transaction.transactionId) > 0, PARSE_DATE('%Y%m%d',(MAX(DATE))) , CURRENT_DATE())
        ,CURRENT_DATE()
        ,DAY) AS days_since_lst_ord
    

    【讨论】:

    • 嗨,这会返回 > 错误:无法在 [10:89] 将文字“未知”转换为类型 DATE
    • 你能不能也试试我的最后一次更新?这似乎是括号问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 2016-11-10
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多