如何在不使用 Join 的情况下处理引用其他表的相关子查询的问题

Posted

技术标签:

【中文标题】如何在不使用 Join 的情况下处理引用其他表的相关子查询的问题【英文标题】:How to work with problems correlated subqueries that reference other tables, without using Join 【发布时间】:2019-03-28 19:14:58 【问题描述】:

我正在尝试处理 BigQuery 的公共数据集 bigquery-public-data.austin_crime.crime。我的目标是将输出作为三列显示 描述(犯罪),数量,以及该特定描述(犯罪)的最高地区。

我可以通过这个查询获得前两列。

  select 
    a.description, 
    count(*) as district_count
    from `bigquery-public-data.austin_crime.crime` a
  group by description order by district_count desc

并希望我可以通过一个查询来完成它,然后我尝试了这个,以便通过添加下面的代码让第三列向我显示该特定描述(犯罪)的***区域

select 
  a.description, 
  count(*) as district_count,

       (
        select district from 
        (  select 
           district, rank() over(order by COUNT(*) desc) as rank
           FROM `bigquery-public-data.austin_crime.crime` 
           where description = a.description
           group by district 
        )  where rank = 1

  ) as top_District

  from `bigquery-public-data.austin_crime.crime` a
  group by description 
  order by district_count desc

我得到的错误是这个。 “不支持引用其他表的相关子查询,除非它们可以去相关,例如通过将它们转换为有效的 JOIN。”

我想我可以通过加入来做到这一点。有人可以在没有加入的情况下使用更好的解决方案吗?

【问题讨论】:

【参考方案1】:

以下是 BigQuery 标准 SQL

#standardSQL
SELECT description, 
  ANY_VALUE(district_count) AS district_count, 
  STRING_AGG(district ORDER BY cnt DESC LIMIT 1) AS top_district
FROM (
  SELECT description, district,
    COUNT(1) OVER(PARTITION BY description) AS district_count,
    COUNT(1) OVER(PARTITION BY description, district) AS cnt
  FROM `bigquery-public-data.austin_crime.crime`
)
GROUP BY description
-- ORDER BY district_count DESC

【讨论】:

你有机会尝试吗?对你起作用吗?它应该! 是的,非常感谢,它确实很忙,没有时间接受这个。 不,这实际上是相应描述的 District_count

以上是关于如何在不使用 Join 的情况下处理引用其他表的相关子查询的问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在不取消引用其他数据的情况下取消引用标题?

如何在不引用其他单元格的情况下将报表从 Reporting Services 2005 导出到 Excel?

如何在不使用 join 或 cte 的情况下在同一查询中使用动态生成的列

如何在不使用自连接的情况下汇总 MySQL 中每一行的前 30 天?

如何在不传递引用的情况下在 Python 中使用 SyncManager 跨进程共享列表

我可以在不等待的情况下提交Firestore批量写入吗?