Sql 多个值上的Bigquery计数和聚合

Sql 多个值上的Bigquery计数和聚合,sql,count,google-bigquery,Sql,Count,Google Bigquery,我现在已经进入BQ一周了(我的硕士论文),在阅读了很多小时的文档之后,我现在挂在这里: 我使用censys数据集,并希望统计在“AT”、“DE”、“CH”国家/地区开放端口的主机数量。到目前为止,我让它为每个国家自己工作。但为了节省成本(也许),我想同时计算这三个国家的成本。或者,当我无法用这种方法节省成本时,我可以继续使用我的第一个解决方案,并在每个国家迭代它 目前一次为一个国家工作: #standardsql SELECT ports, count(ports) AS value FROM

我现在已经进入BQ一周了(我的硕士论文),在阅读了很多小时的文档之后,我现在挂在这里:

我使用censys数据集,并希望统计在“AT”、“DE”、“CH”国家/地区开放端口的主机数量。到目前为止,我让它为每个国家自己工作。但为了节省成本(也许),我想同时计算这三个国家的成本。或者,当我无法用这种方法节省成本时,我可以继续使用我的第一个解决方案,并在每个国家迭代它

目前一次为一个国家工作:

#standardsql
SELECT ports, count(ports) AS value FROM
(
SELECT ip, ports
FROM `censys-io.ipv4_public.20171231` i, i.ports
WHERE location.country_code LIKE 'AT'
)
GROUP BY ports
尝试合并所有国家:

#standardsql
SELECT location.country_code, ports, count(ports) OVER ( PARTITION BY location.country_code) AS value FROM
(
SELECT location.country_code, ports 
FROM `censys-io.ipv4_public.20171231` i, i.ports
WHERE location.country_code LIKE 'AT', 'DE', 'CH'
)
GROUP BY ports
它给了我(当我忽略6中的WHERE错误时):

此处给出了建议的答案,错误截图包括:

我不知道这样做是否正确,或者是否应该使用其他功能。
谢谢你的帮助

下面是BigQuery标准SQL

#standardsql
SELECT 
  country_code, 
  ports, 
  COUNT(ports) OVER ( PARTITION BY country_code, ports) AS value FROM
(
SELECT location.country_code, ports 
FROM `censys-io.ipv4_public.20171231` i, i.ports
WHERE location.country_code IN ('AT', 'DE', 'CH')
)
GROUP BY country_code, ports

下面是BigQuery标准SQL

#standardsql
SELECT 
  country_code, 
  ports, 
  COUNT(ports) OVER ( PARTITION BY country_code, ports) AS value FROM
(
SELECT location.country_code, ports 
FROM `censys-io.ipv4_public.20171231` i, i.ports
WHERE location.country_code IN ('AT', 'DE', 'CH')
)
GROUP BY country_code, ports
我现在明白了:

#standardsql
SELECT 
  country_code, 
  ports, 
  COUNT(ports) AS value FROM
(
SELECT location.country_code, ports 
FROM `censys-io.ipv4_public.20171231` i, i.ports
WHERE location.country_code IN ('AT', 'DE', 'CH')
)
GROUP BY ports, country_code
已删除分区。

我现在已获得分区:

#standardsql
SELECT 
  country_code, 
  ports, 
  COUNT(ports) AS value FROM
(
SELECT location.country_code, ports 
FROM `censys-io.ipv4_public.20171231` i, i.ports
WHERE location.country_code IN ('AT', 'DE', 'CH')
)
GROUP BY ports, country_code

已删除分区。

我发现您的查询存在多个问题。您似乎在两个表之间进行隐式连接。这是有意的吗?我也不认为您需要在这里使用子查询。它只有一个表。如果有更简单的解决方案,我愿意。基本上,我需要所有3个国家的数据,然后我可以下载为json进行处理。也许我需要提到“端口”是一个数组。所以我需要子查询来取消它。我还想提到位置是一个记录。你的比率很低。重要提示-您可以使用投递答案左侧投票下方的勾号
标记接受答案
。看看为什么它很重要!对答案进行投票也很重要。投票选出有帮助的答案。。。当有人回答你的问题时,你可以检查一下该做什么。遵循这些简单的规则,你可以提高自己的声望得分,同时让我们有动力来回答你的问题:O)请考虑!我发现您的查询存在多个问题。您似乎在两个表之间进行隐式连接。这是有意的吗?我也不认为您需要在这里使用子查询。它只有一个表。如果有更简单的解决方案,我愿意。基本上,我需要所有3个国家的数据,然后我可以下载为json进行处理。也许我需要提到“端口”是一个数组。所以我需要子查询来取消它。我还想提到位置是一个记录。你的比率很低。重要提示-您可以使用投递答案左侧投票下方的勾号
标记接受答案
。看看为什么它很重要!对答案进行投票也很重要。投票选出有帮助的答案。。。当有人回答你的问题时,你可以检查一下该做什么。遵循这些简单的规则,你可以提高自己的声望得分,同时让我们有动力来回答你的问题:O)请考虑!关闭时,它会给我一个国家和港口的列表,但值始终为1。您能告诉我为什么必须选择country_code而不是location.country_code吗?当您输出记录的字段而不显式提供别名时,BigQuery会将该字段的名称指定为别名。从“always 1”(您可以看到,我在
PARTITION BY
语句中添加了端口,因为我认为这更有意义)开始,但我不知道您的数据的性质,因此很难对此进行评论谢谢我将查看帮助页面,并感谢您对解决方案的提示!:D@dr.gruselglatz除了其他有益的副作用外,如果你将答案标记为正确,你也会得到分数。结束时,它会给我一个国家和港口的列表,但值总是1。您能告诉我为什么必须选择country_code而不是location.country_code吗?当您输出记录的字段而不显式提供别名时,BigQuery会将该字段的名称指定为别名。从“always 1”(您可以看到,我在
PARTITION BY
语句中添加了端口,因为我认为这更有意义)开始,但我不知道您的数据的性质,因此很难对此进行评论谢谢我将查看帮助页面,并感谢您对解决方案的提示!:D@dr.gruselglatz除了其他有益的副作用外,如果你把答案记对了,你也会得到分数。