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

这不是一个非常有效的查询,但应该可以。通过加入一个查询,通过 AIDOCD 提取最小 DELMN 组(而不是使用对每一行运行的子 select ),它可以更有效.这样,它只需要扫描这些表一次。不要担心,除非你有很多行,这会导致它变慢。