在一个场的BigQuery组由最大值的同时选择不同的行

问题描述 投票:1回答:1

每20分钟的时间内的时间间隔,我试图找到(在下面的表列mbps)带宽的最大值,每个唯一的IP地址的生成,与相应的端口号。

每个IP地址可能会或可能不会显示在每20分钟的时间内超过一次。每一个IP地址被记录在20分钟的周期间隔时间,它可以或可以不具有相同的端口号列出。

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

我们的目标是选择并列出每个唯一的IP地址只有一次,每一个20分钟内的,由降序顺序排序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

我究竟做错了什么?

google-bigquery standard-sql
1个回答
0
投票

下面是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   
© www.soinside.com 2019 - 2024. All rights reserved.