每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
我究竟做错了什么?
下面是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