【问题标题】:Filtering a column based on having some value in one of the rows in SQL or Presto Athena根据 SQL 或 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。

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

【问题讨论】:

    标签: sql group-by presto amazon-athena


    【解决方案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
        

        【讨论】:

          猜你喜欢
          • 2021-11-09
          • 2020-04-19
          • 2018-12-20
          • 2020-08-09
          • 2017-06-17
          • 2021-06-07
          • 2023-03-26
          • 1970-01-01
          • 2015-04-29
          相关资源
          最近更新 更多