AWS Athena SQL 分组并找到不同行中的最小值
AWS Athena SQL to group and find minimum in distinct rows
我有一个针对 AWS Athena 的查询,它的核心工作得很好。我的公司代码是 AA(现场 ACD),我们的竞争对手代码是 BB、CC 和 DD(现场 OCD)。因此,对于我公司进行的每一次不同的旅行,我都会从竞争对手那里得到一系列类似的旅行。我最终得到这样的 table:
主要=
AID ATRIPDT ACD ACAR CY1 CY2 OID OTRIPDT OCD BCAR DELMN
0 10/30/2018 AA XX22 LAS LAX 300 10/30/2018 BB ZZ1 21
0 10/30/2018 AA XX22 LAS LAX 544 10/30/2018 CC T09 36
0 10/30/2018 AA XX22 LAS LAX 755 10/30/2018 BB KLQ 57
0 10/30/2018 AA XX22 LAS LAX 912 10/30/2018 DD 75Q 5
1 10/30/2018 AA P700 LAS LAX 390 10/30/2018 BB MNZ 13
1 10/30/2018 AA P700 LAS LAX 603 10/30/2018 BB JJ1 30
不过最后一步是按AID分组,select每个OCD只有一条记录,应该是DELMN的最小值。
在这种情况下,我正在寻找这样的结果:
AID ATRIPDT ACD ACAR CY1 CY2 OID OTRIPDT OCD BCAR DELMN
0 10/30/2018 AA XX22 LAS LAX 300 10/30/2018 BB ZZ1 21
0 10/30/2018 AA XX22 LAS LAX 544 10/30/2018 CC T09 36
0 10/30/2018 AA XX22 LAS LAX 912 10/30/2018 DD 75Q 5
1 10/30/2018 AA P700 LAS LAX 390 10/30/2018 BB MNZ 13
我试过了
with main as
(
<complex query that returns main table>
)
select * from main
where DELMN = (select min(DELMN) from main as b where b.OCD=main.OCD
其中 returns 总共三个记录,所以我没有正确设置分组。脑筋急转弯,所以不知道还能尝试什么。
你想要每个 AID+OCD 值一行,所以你会想要这样的东西:
WITH main AS
(
<complex query that returns main table>
)
SELECT *
FROM main
WHERE DELMN = (SELECT MIN(DELMN)
FROM main AS b
WHERE b.OCD=main.OCD AND b.AID = main.AID)
GROUP BY AID, OCD
这不是一个非常有效的查询,但应该可以。通过加入一个查询,通过 AID
和 OCD
提取最小 DELMN
组(而不是使用对每一行运行的子 select ),它可以更有效.这样,它只需要扫描这些表一次。不要担心,除非你有很多行,这会导致它变慢。
我有一个针对 AWS Athena 的查询,它的核心工作得很好。我的公司代码是 AA(现场 ACD),我们的竞争对手代码是 BB、CC 和 DD(现场 OCD)。因此,对于我公司进行的每一次不同的旅行,我都会从竞争对手那里得到一系列类似的旅行。我最终得到这样的 table:
主要=
AID ATRIPDT ACD ACAR CY1 CY2 OID OTRIPDT OCD BCAR DELMN
0 10/30/2018 AA XX22 LAS LAX 300 10/30/2018 BB ZZ1 21
0 10/30/2018 AA XX22 LAS LAX 544 10/30/2018 CC T09 36
0 10/30/2018 AA XX22 LAS LAX 755 10/30/2018 BB KLQ 57
0 10/30/2018 AA XX22 LAS LAX 912 10/30/2018 DD 75Q 5
1 10/30/2018 AA P700 LAS LAX 390 10/30/2018 BB MNZ 13
1 10/30/2018 AA P700 LAS LAX 603 10/30/2018 BB JJ1 30
不过最后一步是按AID分组,select每个OCD只有一条记录,应该是DELMN的最小值。
在这种情况下,我正在寻找这样的结果:
AID ATRIPDT ACD ACAR CY1 CY2 OID OTRIPDT OCD BCAR DELMN
0 10/30/2018 AA XX22 LAS LAX 300 10/30/2018 BB ZZ1 21
0 10/30/2018 AA XX22 LAS LAX 544 10/30/2018 CC T09 36
0 10/30/2018 AA XX22 LAS LAX 912 10/30/2018 DD 75Q 5
1 10/30/2018 AA P700 LAS LAX 390 10/30/2018 BB MNZ 13
我试过了
with main as
(
<complex query that returns main table>
)
select * from main
where DELMN = (select min(DELMN) from main as b where b.OCD=main.OCD
其中 returns 总共三个记录,所以我没有正确设置分组。脑筋急转弯,所以不知道还能尝试什么。
你想要每个 AID+OCD 值一行,所以你会想要这样的东西:
WITH main AS
(
<complex query that returns main table>
)
SELECT *
FROM main
WHERE DELMN = (SELECT MIN(DELMN)
FROM main AS b
WHERE b.OCD=main.OCD AND b.AID = main.AID)
GROUP BY AID, OCD
这不是一个非常有效的查询,但应该可以。通过加入一个查询,通过 AID
和 OCD
提取最小 DELMN
组(而不是使用对每一行运行的子 select ),它可以更有效.这样,它只需要扫描这些表一次。不要担心,除非你有很多行,这会导致它变慢。