根据 SQL 或 Presto Athena 中的某一行中的某个值过滤列

Posted

技术标签:

【中文标题】根据 SQL 或 Presto Athena 中的某一行中的某个值过滤列【英文标题】:Filtering a column based on having some value in one of the rows in SQL or Presto Athena 【发布时间】:2020-10-06 22:25:46 【问题描述】:

我正在 Athena 中尝试仅输出具有特定价值但不是在所有行中具有特定价值的用户

假设我有下表。 我希望所有用户至少在其中一行中具有值“100”,但在其他行中的值也不同于 100。

user | value

A    | 1

B    | 2

A    | 100

D    | 3

A    | 4

C    | 3

C    | 5

D    | 100

所以在这个例子中,我只想获取用户 A 和 D,因为只有他们有 100,没有 100。

我尝试过按用户分组并为每个用户创建一个值数组,然后检查数组是否包含 100,但我无法做到这一点。 我还考虑将行转换为列,然后检查其中一列是否等于 100。

那些解决方案太复杂了?任何人都知道如何实现它们或任何人有更好更简单的解决方案?

【问题讨论】:

【参考方案1】:

可以使用以下 SQL 找到至少一个值为 100 的用户:

SELECT DISTINCT user
FROM some_table
WHERE value = 100

但我假设您毕竟是用户和值的元组,其中用户至少有一个值为 100,这可以通过在稍微复杂的查询中使用上面的查询来完成:

WITH matching_users AS (
  SELECT DISTINCT user
  FROM some_table
  WHERE value = 100
)
SELECT user, value
FROM matching_users
LEFT JOIN some_table USING (user)

【讨论】:

【参考方案2】:

您可以使用下面的子查询来实现您所需的输出=

SELECT * FROM your_table
WHERE User IN(
    SELECT DISTINCT User
    FROM your_table
    WHERE Value = 100
)

【讨论】:

【参考方案3】:

如果你只想要用户,我会去聚合:

select user
from t
group by user
having sum(case when value = 100 then 1 else 0 end) > 0;

如果100 是最大可能值,则可以简化为:

having max(value) = 100

【讨论】:

以上是关于根据 SQL 或 Presto Athena 中的某一行中的某个值过滤列的主要内容,如果未能解决你的问题,请参考以下文章

使用 Athena / Presto 从多个表返回 SQL 数据,受 1 个表中的日期范围限制

删除 Presto SQL 兼容数据库 (AWS Athena) 中数据中的双引号?

Athena (Presto) SQL 窗口函数

Presto SQL / Athena:在不同日期的时间之间进行选择

Presto SQL / Athena:如何从“间隔天到秒”只返回小时、分钟和秒

如何将表示 EPOCH 时间的整数转换为 Athena (Presto) 中的时间戳?