对于参数类型,运算符 >= 没有匹配的签名:“INT64”、“ARRAY<INT64>”

No matching signature for operator >= for argument types: `INT64`, `ARRAY<INT64>`

提问人:Danylo Borges Naves 提问时间:9/11/2023 最后编辑:lemonDanylo Borges Naves 更新时间:9/12/2023 访问量:99

问:

我正在尝试生成一个间隔为 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

我一直得到的错误是:

对于参数类型,运算符 >= 没有匹配的签名:, .支持的签名:ANY >= ANY at [18:11]INT64ARRAY<INT64>

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

我感谢任何帮助。

SQL 日期 google-bigquery 语法错误

评论

0赞 NickW 9/11/2023
嗨 - 你对那个错误消息有什么不明白的地方?您正在将时间戳与数组进行比较,该数组是 a) 不允许的,并且 b) 即使允许也毫无意义。你到底想达到什么目的?
0赞 Danylo Borges Naves 9/12/2023
我试图做的是创建一个列表,其中每行指定,按范围 00:00:00 到 01:00:00,以及表中计算了此范围内的游乐设施数量。我认为问题在于“cicle”没有像柠檬所说的那样聚合。我更新了我的表格,因为我拥有的列 - ride_lenght - 超过了时间范围 24:00:00,而且它是字符串格式!

答:

0赞 lemon 9/11/2023 #1

查询中存在以下几个错误:

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

要修复这些错误,您可以:

  • 更改第一个 CTE,通过交叉连接函数输出的应用程序,将数组解压缩为表格值UNNESTGENERATE_ARRAY
  • 在子句中添加“cicle”列,以反映 cicle 分区。GROUP BY

次要可选修复:

  • 使用子句中的两个条件代替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

评论

0赞 Danylo Borges Naves 9/12/2023
WITH bins AS( SELECT * FROM UNNEST(GENERATE_ARRAY(0,1470,30)) AS low, UNNEST(GENERATE_ARRAY(0,1500,30)) AS high ), RIDE AS( SELECT COUNT(rides_lenght) AS CICLE FROM WHERE rideable_type != 'docked_bike' ) SELECT low, high, cicle FROM bins LEFT JOIN RIDE ON cicle BETWEEN LOW AND HIGH GROUP BY low, high ORDER BY lowdata-project-389314.Cyclist.july23_trip_filtered
0赞 lemon 9/12/2023
使用是您在此处修改的解决方案中的正确编写方式。应仅在存在聚合函数的情况下使用。DISTINCTGROUP BY low, highGROUP BY