【问题标题】:SQL works in Athena Engine v1 but not v2SQL 适用于 Athena Engine v1 但不适用于 v2
【发布时间】:2021-07-08 13:47:51
【问题描述】:

我有一个嵌入到系统中的 SQL 查询,到目前为止,该系统在 Athena 中使用引擎版本 1 成功运行。但是它在引擎版本 2 中失败,我无法找出原因。

这是 SQL 的通用版本。它总结了 3 组的人数:成年人、纽约居民和两者的重叠。 (纽约成年人)。

在版本 1 中这有效,但在 v2 中我收到错误“无法解析列 z.id_field”

WITH BASE AS (SELECT person_id, age, state
              FROM people 
              WHERE gender  = 'male'
                 )

    ,group_a as (
SELECT distinct (person_id) as id_field
FROM BASE
WHERE age > 17
),
  
  group_b as (
SELECT distinct (person_id) as id_field
FROM BASE
WHERE state = 'NY'
)


SELECT CASE WHEN z.id_field is null then 'group_b_only' WHEN r.id_field is null then 'group_a_only' ELSE 'Overlap' END as group
      , COUNT (coalesce (z.id_field, r.id_field)) as count
FROM group_a AS z FULL OUTER JOIN group_b as r USING (id_field)
GROUP BY 1;

【问题讨论】:

  • 我不认识 Athena,但在某些数据库中,我看到使用 (id_field) 将 z.id_field 和 r.id_field 折叠成一个单独的列 id_field,不附加到 z 或 r。尝试不带 z 前缀的 id_field。
  • @Rup 。 . . using 应该支持两者。
  • @GordonLinoff 我也这么认为,但我又找到了。这是 Oracle 19c,ORA-25154 的 USING 子句的列部分不能有限定符。
  • @Rup 。 . .这真的,真的很奇怪。你应该如何检查外部join 中是否有匹配项? [我不希望你回答这个问题。]

标签: sql amazon-athena


【解决方案1】:

请注意,在 any 数据库中,这作为聚合会更简单,也可能更快:

SELECT grp, COUNT(*)
FROM (SELECT person_id,
             (CASE WHEN MAX(age) > 17 AND MAX(state) = 'NY' THEN 'Both'
                   WHEN MAX(age) > 17 THEN 'Age Only'
                   ELSE 'State Only'
              END) as grp
      FROM people 
      WHERE gender  = 'male' AND
            (age > 17 OR state = 'NY')
      GROUP BY person_id
     ) x
GROUP BY grp;

以上假设person_id可以在people中重复。如果不是这样,那么可以简化为:

SELECT (CASE WHEN age > 17 AND state = 'NY' THEN 'Both'
             WHEN age > 17 THEN 'Age Only'
             ELSE 'State Only'
         END) as grp, COUNT(*)
FROM people 
WHERE gender  = 'male' AND
      (age > 17 OR state = 'NY')
GROUP BY grp;
     

【讨论】:

  • 感谢 Gordon,它的结构是这样的,以便 c# 代码可以轻松地编辑 SQL 以更改 group_a 和 group_b 的定义。我发布的 SQL 已大大简化以演示 Athena 错误消息。
  • @Bill0688 。 . .这种结构也很容易改变——如果目标是传递一次值,可能会变得更简单。
猜你喜欢
  • 1970-01-01
  • 2017-03-25
  • 2021-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多