根据 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) 中数据中的双引号?
Presto SQL / Athena:在不同日期的时间之间进行选择