Google bigquery BigQuery在选择不同行时按一个字段中的最大值分组
对于每20分钟的时间间隔,我试图找到带宽的最大值(下表中的列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(带宽)列的值不同 目
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)请考虑!