我在芝加哥犯罪数据集上使用google-bigquery
。但是,我想从primary_type
栏中找出每个不同的block
的最常见犯罪类型。为此,我遵循standardSQL
。
数据:
由于芝加哥犯罪数据相当大,因此有一个官方网站可以预览数据集:crime data on Google cloud
我当前的标准SQL:
SELECT primary_type,block, COUNT(*) as count
FROM `bigquery-public-data.chicago_crime.crime`
HAVING COUNT(*) = (SELECT MAX(count)
FROM (SELECT primary_type, COUNT(*) as count FROM `bigquery-public-data.chicago_crime.crime` GROUP BY primary_type, block) `bigquery-public-data.chicago_crime.crime`)
我上面的查询的问题是现在有一个错误,对我来说,即使我修复了这个错误,该查询的效率也很低。如何解决和优化上述查询?
如何在标准SQL中使用正则表达式:
要计算每个区块(包括北方和南方)的最频繁类型,我必须处理regex
,例如033XX S WOOD ST
,我应该只得到S WOOT ST
,并且033XX N WOOD ST
。我需要获取N WOOD ST
并获得这些计数。我该怎么办?
所需的输出:
在我想要的输出中,对于每个块,例如WOOD ST (North (N WOOD ST)
和South(S WOOD ST))
上的块。我想找到最常见的犯罪类型。在最终输出中,我期望三列,例如block
,primary_type
,count
。有没有办法通过google-bigquery
完成此任务?
答案 0 :(得分:1)
以下是用于BigQuery标准SQL
#standardSQL
SELECT
block,
ARRAY_AGG(STRUCT(primary_type, cnt) ORDER BY cnt DESC LIMIT 1)[OFFSET(0)].*
FROM (
SELECT
block,
primary_type,
COUNT(*) cnt
FROM `bigquery-public-data.chicago_crime.crime`
GROUP BY block, primary_type
)
GROUP BY block
如何获得WOOD ST街区最常见的犯罪类型?任何黑客做到这一点?
我对这些数据的细节不熟悉,但是从简短的眼光看-我认为您可以在下面尝试
#standardSQL
SELECT
block,
ARRAY_AGG(STRUCT(primary_type, cnt) ORDER BY cnt DESC LIMIT 1)[OFFSET(0)].*
FROM (
SELECT
SUBSTR(block, 8) block,
primary_type,
COUNT(*) cnt
FROM `bigquery-public-data.chicago_crime.crime`
GROUP BY block, primary_type
)
GROUP BY block
答案 1 :(得分:1)
这应该可以让您分批查看最常见的犯罪
内部查询次数计算犯罪发生率,窗口划分功能根据按块划分的犯罪发生频率的降序计算排名。外部查询,其中子句rank = 1仅返回最常见的犯罪。您可以更改外部查询where子句,使其排名为<= 5
,从而获得前5名常见犯罪select * from
(SELECT block, primary_type, count(primary_type) as crime_frquency,
ROW_NUMBER() OVER (PARTITION BY block ORDER BY count(primary_type) DESC) AS rank
FROM `bigquery-public-data.chicago_crime.crime`
group by block, primary_type)
where rank = 1