参数类型的运算符 >= 没有匹配的签名:`INT64`、`ARRAY<INT64>`

问题描述 投票:0回答:1

我正在尝试生成一个数字系列,其间隔为数字 30,分别代表 30 分钟。

目前,我的查询如下所示:

WITH bins AS(
    SELECT GENERATE_ARRAY(0,1470,30) AS low,
           GENERATE_ARRAY(0,1500,30) AS top
), ride AS(
    SELECT DATE_DIFF(ended_at,started_at,minute) as cicle
    FROM `data-project-389314.Cyclist.july23_trip_filtered`
    WHERE rideable_type != 'docked_bike'
)
SELECT low,
       top, 
       cicle
FROM      bins
LEFT JOIN ride
       ON cicle >= low  --Error line
      AND cicle < top
GROUP BY low,
         top
ORDER BY low

我不断收到的错误是:

参数类型的运算符 >= 没有匹配的签名:

INT64
ARRAY<INT64>
。支持的签名:ANY >= ANY [18:11]

我尝试了其他代码,这让我认识到 Bigquery 不允许时间日期 >= 24:00:00 但我总是在同一变量上收到错误。

我感谢任何帮助。

sql date google-bigquery syntax-error
1个回答
0
投票

您的查询中有几个错误:

  • 您的
    GENERATE_ARRAY
    函数将生成一个数组,而不是一个表。因此,当您尝试连接匹配值时,您实际上是在尝试将“cicle”的每个单个值与完整数组进行匹配。
  • 在最终查询中,您使用了
    GROUP BY
    子句,但没有使用聚合函数。如果根据数据的性质认为有必要,您可以使用
    DISTINCT
    删除重复记录。或者,如果应执行任何聚合函数,请确保聚合“cicle”或将其添加到
    GROUP BY
    子句,以避免细微的错误。

为了修复这些错误,您可以:

  • 更改第一个 cte,通过在
    UNNEST
    函数的输出上交叉连接
    GENERATE_ARRAY
    的应用程序,将数组解包为表格值。
  • GROUP BY 子句中添加“cicle
    ”列,以反映 cicle 分区。
较小的可选修复:

    使用
  • BETWEEN ... AND ...
     代替 
    WHERE
     子句中的两个条件
  • 将名称“top”更改为“high”(看起来更适合“low”)
WITH bins AS( SELECT * FROM UNNEST(GENERATE_ARRAY(0,1470,30)) AS low, UNNEST(GENERATE_ARRAY(0,1500,30)) AS high ), ride AS( SELECT DATE_DIFF(ended_at,started_at,minute) as cicle FROM `data-project-389314.Cyclist.july23_trip_filtered` WHERE rideable_type != 'docked_bike' ) SELECT DISTINCT low, high, cicle FROM bins LEFT JOIN ride ON cicle BETWEEN low AND high ORDER BY low
    
© www.soinside.com 2019 - 2024. All rights reserved.