Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.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
Google bigquery BigQuery在选择不同行时按一个字段中的最大值分组_Google Bigquery_Bigquery Standard Sql - Fatal编程技术网

Google bigquery BigQuery在选择不同行时按一个字段中的最大值分组

Google bigquery BigQuery在选择不同行时按一个字段中的最大值分组,google-bigquery,bigquery-standard-sql,Google Bigquery,Bigquery Standard Sql,对于每20分钟的时间间隔,我试图找到带宽的最大值(下表中的列mbps),每个唯一的IP地址都会生成相应的端口号 每20分钟内,每个IP地址可能会或不会出现一次以上。每次在20分钟的时间间隔内记录IP地址时,它可能会列出相同的端口号,也可能不会列出相同的端口号 例如,在下表中,ip地址192.168.10.1在12:20期间显示三次,端口号分别为443、80和80。在另一个场景中,ip地址192.168.10.2在12:40期间显示两次,相同的端口号443列出两次,但mbps(带宽)列的值不同 目

对于每20分钟的时间间隔,我试图找到带宽的最大值(下表中的列
mbps
),每个唯一的IP地址都会生成相应的端口号

每20分钟内,每个IP地址可能会或不会出现一次以上。每次在20分钟的时间间隔内记录IP地址时,它可能会列出相同的端口号,也可能不会列出相同的端口号

例如,在下表中,ip地址192.168.10.1在12:20期间显示三次,端口号分别为443、80和80。在另一个场景中,ip地址192.168.10.2在12:40期间显示两次,相同的端口号443列出两次,但mbps(带宽)列的值不同

目标是在20分钟内的每一段时间内只选择和列出一次每个唯一的ip地址,并按描述顺序按mbps排序

根据数据注入的时间对表进行分区

我计划编写一个cron作业,以自动执行此查询。cron作业将每小时运行一次,每周7天。查询将使用标准SQL

原始表格:

Row time                ip_address          port        mbps

1   01/01/2019 12:20    192.168.10.1        443         100
2   01/01/2019 12:20    192.168.10.1        80          120
3   01/01/2019 12:20    192.168.10.2        80          200
4   01/01/2019 12:20    192.168.10.1        80          110
5   01/01/2019 12:40    192.168.10.2        443         200
6   01/01/2019 12:40    192.168.10.3        443         300
7   01/01/2019 12:40    192.168.10.2        443         200
8   01/01/2019 12:40    192.168.10.1        443         300
9   01/01/2019 13:00    192.168.10.3        443         90
10  01/01/2019 13:00    192.168.10.2        80          100
11  01/01/2019 13:00    192.168.10.1        443         500
执行下面的代码

#standardSQL
SELECT
  FORMAT_TIMESTAMP("%d/%m/%Y %H:%M", TIMESTAMP_SECONDS, 'Europe/London') AS time,
  ip_address,
  port,
  SUM(bandwidth) AS mbps,
FROM
  dataset1.table1
WHERE
  _PARTITIONDATE = DATE_SUB(CURRENT_DATE(),INTERVAL 0 DAY)  
  AND timestamp > TIMESTAMP_ADD(CURRENT_TIMESTAMP(),INTERVAL -40 MINUTE)
GROUP BY
  time,
  ip_address,
  port
ORDER BY
  time,
  mbps DESC
我得到这张桌子

Row time                ip_address          port        mbps

1   01/01/2019 12:20    192.168.10.2        80          200
2   01/01/2019 12:20    192.168.10.1        80          120
3   01/01/2019 12:20    192.168.10.1        80          110
4   01/01/2019 12:20    192.168.10.1        443         100
5   01/01/2019 12:40    192.168.10.1        443         300
6   01/01/2019 12:40    192.168.10.3        443         300
7   01/01/2019 12:40    192.168.10.2        25          200
8   01/01/2019 12:40    192.168.10.2        443         160
9   01/01/2019 13:00    192.168.10.1        443         500
10  01/01/2019 13:00    192.168.10.2        80          100
11  01/01/2019 13:00    192.168.10.3        443         90
这不是我想要的。相反,我想要这个:

Row time                ip_address          port        mbps

1   01/01/2019 12:20    192.168.10.2        80          200
2   01/01/2019 12:20    192.168.10.1        80          120
3   01/01/2019 12:40    192.168.10.1        443         300
4   01/01/2019 12:40    192.168.10.3        443         300
5   01/01/2019 12:40    192.168.10.2        25          200
6   01/01/2019 13:00    192.168.10.1        443         500
7   01/01/2019 13:00    192.168.10.2        80          100
8   01/01/2019 13:00    192.168.10.3        443         90

我做错了什么?

下面是针对BigQuery标准SQL的

#standardSQL
SELECT time, ip_address, 
  ARRAY_AGG(STRUCT(port, mbps) ORDER BY mbps DESC LIMIT 1)[OFFSET(0)].*
FROM `project.dataset.table`
GROUP BY time, ip_address
您可以使用问题中的样本数据测试、播放上述内容,如下例所示

#standardSQL
WITH `project.dataset.table` AS (
  SELECT '01/01/2019 12:20' time, '192.168.10.1' ip_address, 443 port, 100 mbps UNION ALL
  SELECT '01/01/2019 12:20', '192.168.10.1', 80, 120 UNION ALL
  SELECT '01/01/2019 12:20', '192.168.10.2', 80, 200 UNION ALL
  SELECT '01/01/2019 12:20', '192.168.10.1', 80, 110 UNION ALL
  SELECT '01/01/2019 12:40', '192.168.10.2', 443, 200 UNION ALL
  SELECT '01/01/2019 12:40', '192.168.10.3', 443, 300 UNION ALL
  SELECT '01/01/2019 12:40', '192.168.10.2', 443, 200 UNION ALL
  SELECT '01/01/2019 12:40', '192.168.10.1', 443, 300 UNION ALL
  SELECT '01/01/2019 13:00', '192.168.10.3', 443, 90 UNION ALL
  SELECT '01/01/2019 13:00', '192.168.10.2', 80, 100 UNION ALL
  SELECT '01/01/2019 13:00', '192.168.10.1', 443, 500 
)
SELECT time, ip_address, 
  ARRAY_AGG(STRUCT(port, mbps) ORDER BY mbps DESC LIMIT 1)[OFFSET(0)].*
FROM `project.dataset.table`
GROUP BY time, ip_address
-- ORDER BY time, ip_address
结果

Row time                ip_address      port    mbps     
1   01/01/2019 12:20    192.168.10.1    80      120  
2   01/01/2019 12:20    192.168.10.2    80      200  
3   01/01/2019 12:40    192.168.10.1    443     300  
4   01/01/2019 12:40    192.168.10.2    443     200  
5   01/01/2019 12:40    192.168.10.3    443     300  
6   01/01/2019 13:00    192.168.10.1    443     500  
7   01/01/2019 13:00    192.168.10.2    80      100  
8   01/01/2019 13:00    192.168.10.3    443     90   

下面是BigQuery标准SQL

#standardSQL
SELECT time, ip_address, 
  ARRAY_AGG(STRUCT(port, mbps) ORDER BY mbps DESC LIMIT 1)[OFFSET(0)].*
FROM `project.dataset.table`
GROUP BY time, ip_address
您可以使用问题中的样本数据测试、播放上述内容,如下例所示

#standardSQL
WITH `project.dataset.table` AS (
  SELECT '01/01/2019 12:20' time, '192.168.10.1' ip_address, 443 port, 100 mbps UNION ALL
  SELECT '01/01/2019 12:20', '192.168.10.1', 80, 120 UNION ALL
  SELECT '01/01/2019 12:20', '192.168.10.2', 80, 200 UNION ALL
  SELECT '01/01/2019 12:20', '192.168.10.1', 80, 110 UNION ALL
  SELECT '01/01/2019 12:40', '192.168.10.2', 443, 200 UNION ALL
  SELECT '01/01/2019 12:40', '192.168.10.3', 443, 300 UNION ALL
  SELECT '01/01/2019 12:40', '192.168.10.2', 443, 200 UNION ALL
  SELECT '01/01/2019 12:40', '192.168.10.1', 443, 300 UNION ALL
  SELECT '01/01/2019 13:00', '192.168.10.3', 443, 90 UNION ALL
  SELECT '01/01/2019 13:00', '192.168.10.2', 80, 100 UNION ALL
  SELECT '01/01/2019 13:00', '192.168.10.1', 443, 500 
)
SELECT time, ip_address, 
  ARRAY_AGG(STRUCT(port, mbps) ORDER BY mbps DESC LIMIT 1)[OFFSET(0)].*
FROM `project.dataset.table`
GROUP BY time, ip_address
-- ORDER BY time, ip_address
结果

Row time                ip_address      port    mbps     
1   01/01/2019 12:20    192.168.10.1    80      120  
2   01/01/2019 12:20    192.168.10.2    80      200  
3   01/01/2019 12:40    192.168.10.1    443     300  
4   01/01/2019 12:40    192.168.10.2    443     200  
5   01/01/2019 12:40    192.168.10.3    443     300  
6   01/01/2019 13:00    192.168.10.1    443     500  
7   01/01/2019 13:00    192.168.10.2    80      100  
8   01/01/2019 13:00    192.168.10.3    443     90   

非常感谢@mikhail berlyant。在我的案例中,我将如何通过数百万行进行选择?我是否仍然需要使用
UNION ALL
?否-提供给您的第二个查询用于测试。您应该使用第一个查询,将“project.dataset.table”替换为对实际表的引用。有意义吗?谢谢你的及时回复@mikhail berlyant!在我的例子中,我有数百万行,因此我不能使用
UNION ALL
除了数百万行之外,实现相同结果的最佳方法是什么?我尝试了很多方法,但都没有具体的结果。嗨@michail berlyant,除了一小部分之外,我已经设法让它工作了。关于mbps列,我必须首先将我获得的原始数据(以字节为单位)转换为mbps,即传入的_字节*8*10000/1000000作为mbps。这意味着我必须准备好以下内容:输入字节131072作为mbps,数组聚合(结构(端口,输入字节作为mbps)顺序按mbps描述限制1)[偏移量(0)]。问题是,当我执行上述操作时,它会抛出错误:无法识别的名称:mbps。您知道在这种情况下,我如何通过mbps获得订单吗?非常感谢,一如既往!请发布新问题,并附上新问题的详细信息,我(或其他人)将非常乐意回答。同时,考虑接受你最初的问题的答案,非常感谢米哈伊尔伯利南特。在我的案例中,我将如何通过数百万行进行选择?我是否仍然需要使用
UNION ALL
?否-提供给您的第二个查询用于测试。您应该使用第一个查询,将“project.dataset.table”替换为对实际表的引用。有意义吗?谢谢你的及时回复@mikhail berlyant!在我的例子中,我有数百万行,因此我不能使用
UNION ALL
除了数百万行之外,实现相同结果的最佳方法是什么?我尝试了很多方法,但都没有具体的结果。嗨@michail berlyant,除了一小部分之外,我已经设法让它工作了。关于mbps列,我必须首先将我获得的原始数据(以字节为单位)转换为mbps,即传入的_字节*8*10000/1000000作为mbps。这意味着我必须准备好以下内容:输入字节131072作为mbps,数组聚合(结构(端口,输入字节作为mbps)顺序按mbps描述限制1)[偏移量(0)]。问题是,当我执行上述操作时,它会抛出错误:无法识别的名称:mbps。您知道在这种情况下,我如何通过mbps获得订单吗?非常感谢,一如既往!请发布新问题,并附上新问题的详细信息,我(或其他人)将非常乐意回答。同时考虑接受你原来问题的答案,你的税率很低。重要提示-您可以使用投递答案左侧投票下方的勾号
标记接受答案
。看看为什么它很重要!对答案进行投票也很重要。投票选出有帮助的答案。。。当有人回答你的问题时,你可以检查一下该做什么。遵循这些简单的规则,你可以提高自己的声望得分,同时让我们有动力来回答你的问题:O)请考虑!你的利率很低。重要提示-您可以使用投递答案左侧投票下方的勾号
标记接受答案
。看看为什么它很重要!对答案进行投票也很重要。投票选出有帮助的答案。。。当有人回答你的问题时,你可以检查一下该做什么。遵循这些简单的规则,你可以提高自己的声望得分,同时让我们有动力来回答你的问题:O)请考虑!