我正在尝试根据组织的城市和州从我们的数据库中检索组织列表,并按属性org_name
进行分组。这些组织具有多个嵌套数组作为其他属性。我必须取消嵌套LOCATIONS
聚合数组才能查询正确的位置。由于我是按组织名称分组的,因此我将每个数组的其余所需属性与ARRAY_CONCAT_AGG
进行汇总,然后运行一个名为dedup
的用户定义函数以删除所有重复值,因为所有所需属性都必须进行分组或汇总。这在一张小桌子上完美地工作,但是当我放大时会收到以下错误。
Resources exceeded during query execution: The query could not be executed in the allotted memory. Peak usage: 116% of limit. Top memory consumer(s): aggregate functions and GROUP BY clauses: 95% other/unattributed: 5%
。
代码如下:
CREATE TEMP FUNCTION
dedup(val ANY TYPE) AS ((
SELECT
ARRAY_AGG(t)
FROM (
SELECT
DISTINCT *
FROM
UNNEST(val) v) t ));
SELECT
org_name,
dedup(ARRAY_CONCAT_AGG(sizes)) AS sizes,
dedup(ARRAY_CONCAT_AGG(org_nums)) AS org_nums,
dedup(ARRAY_CONCAT_AGG(location)) AS location,
dedup(ARRAY_CONCAT_AGG(types_of_professionals)) AS types_of_professionals,
dedup(ARRAY_CONCAT_AGG(specialties)) AS specialties
FROM
`merging_npi_medicare.practices`,
UNNEST(location) AS loc
WHERE
loc.professional_city = "HARRISBURG"
AND loc.professional_state = "PA"
GROUP BY
org_name
我的预期结果将是一个独特的组织表格,其中包含各种规模,电话号码,位置,专业人员类型和专长。但是,我在运行此代码时收到内存超出错误。我知道错误肯定出在我的许多聚合数组和UDF函数调用上,但是我根本不知道该如何实现我想要的目标。
以下链接演示了我希望结果如何显示。通过运行与上面相同的查询,只是使用一个额外的参数即可实现,该参数仅查找名称包含PINNACLE
的组织。
https://i.stack.imgur.com/8nJpb.png
我们将不胜感激!
答案 0 :(得分:1)
我不得不推测一下数据是什么样的。但是这样改写是否可以解决问题?
select org_name,
(select array_agg(s.size)
from `merging_npi_medicare.practices` p cross join
unnest(sizes) s
where p.org_name = o.org_name
) as sizes
from (select distinct org_name
from `merging_npi_medicare.practices` cross join
unnest(location) AS loc
where loc.professional_city = 'HARRISBURG' and
loc.professional_state = 'PA'
) o;