Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如果一个数组包含来自另一个数组的所有值,如何使用BigQuery筛选行?_Sql_Arrays_Google Bigquery - Fatal编程技术网

Sql 如果一个数组包含来自另一个数组的所有值,如何使用BigQuery筛选行?

Sql 如果一个数组包含来自另一个数组的所有值,如何使用BigQuery筛选行?,sql,arrays,google-bigquery,Sql,Arrays,Google Bigquery,我需要从BigQuery中的表中获取特定数组。然后,如果分区窗口中的某个数组已经具有当前数组的所有值和其他一些值,我想减少行数 with t0 as (SELECT 1 as big_id, '101' as small_id, 0.99 as bottom, 1.03 top UNION ALL SELECT 1, '102', 1.05, 1.09 UNION ALL SELECT 1, '103', 1.09, 1.13 UNION ALL SELEC

我需要从BigQuery中的表中获取特定数组。然后,如果分区窗口中的某个数组已经具有当前数组的所有值和其他一些值,我想减少行数

with t0 as (SELECT 1 as big_id, '101' as small_id,  0.99 as bottom, 1.03 top
      UNION ALL SELECT 1, '102', 1.05, 1.09
      UNION ALL SELECT 1, '103', 1.09, 1.13
      UNION ALL SELECT 1, '104', 1.2, 1.25
      UNION ALL SELECT 1, '105', 1.33, 1.39
      UNION ALL SELECT 2, '102', 1.05, 1.09
      UNION ALL SELECT 2, '103', 1.09, 1.13
      UNION ALL SELECT 2, '104', 1.2, 1.25
      UNION ALL SELECT 2, '105', 1.33, 1.39)
SELECT t0.big_id, row_number() OVER (PARTITION BY t0.big_id) group_id, ARRAY_AGG(t1.small_id) my_arrays FROM t0
CROSS JOIN t0 t1

WHERE t0.big_id = t1.big_id AND t1.top/t0.bottom BETWEEN 1 AND 1.15
GROUP BY t0.big_id, t0.small_id
我有一张带有ID和置信区间顶部和底部的表。我想比较从
small\u id
开始的所有唯一
small\u id
对和底部较低的部分。 唯一对表示:如果已经比较了
101和102
,则不需要比较
102和101
。 然后我需要将具有相似置信区间的
small_id
s分组到数组中。 然后,若所有ID在同一分区窗口中的某个更大的组中匹配,那个么我需要减少组。
small\u id
不是数字。只有文本字符串。因此不可能直接将
small_id
作为数字进行比较

这些行是我需要减少的,因为我在另一个数组中得到了值


如何修改查询以获得预期的输出?

下面是BigQuery标准SQL

#standardsql
with t0 as (SELECT 1 as big_id, '101' as small_id,  0.99 as bottom, 1.03 top
  UNION ALL SELECT 1, '102', 1.05, 1.09
  UNION ALL SELECT 1, '103', 1.09, 1.13
  UNION ALL SELECT 1, '104', 1.2, 1.25
  UNION ALL SELECT 1, '105', 1.33, 1.39
  UNION ALL SELECT 2, '102', 1.05, 1.09
  UNION ALL SELECT 2, '103', 1.09, 1.13
  UNION ALL SELECT 2, '104', 1.2, 1.25
  UNION ALL SELECT 2, '105', 1.33, 1.39
), temp as (      
  SELECT t0.big_id, 
    row_number() OVER (PARTITION BY t0.big_id) group_id, 
    ARRAY_AGG(t1.small_id) my_arrays FROM t0
  CROSS JOIN t0 t1
  WHERE t0.big_id = t1.big_id AND t1.top/t0.bottom BETWEEN 1 AND 1.15
  GROUP BY t0.big_id, t0.small_id
)
select big_id, group_id, any_value(my_arrays) my_arrays 
from (
  select t1.*,
    ( select count(1)
      from t1.my_arrays id
      join t2.my_arrays id
      using(id)
      where t1.group_id != t2.group_id
    ) = array_length(t1.my_arrays) as flag
  from temp t1 
  join temp t2
  using (big_id)
)
group by big_id, group_id
having countif(flag) = 0     
有输出


所有这些十字和箭头都没有帮助-请澄清您在普通视图中的预期结果,以及您试图在查询中实现的逻辑。谢谢您的回复!我添加了更多关于预期结果的详细信息,这对您很有用。最初我认为它是纯粹基于递归的逻辑,可以通过脚本或JSUDF来解决。但经过一段时间的睡眠后,我意识到这可以通过基于场景的方式完成——所以,我们开始:o)谢谢。它看起来比js好多了。使用JSUDF我们失去了什么?通常你会想把你的逻辑转换成基于集合的方式,这样你就可以使用最有效的纯SQL了!如果这是不可能的,当你会寻找脚本或JSUDF有一些限制。所以要回答“我们正在失去什么”,我会说——基于集合的操作的有效性