Фильтрация столбца на основании некоторого значения в одной из строк в SQL или Presto Athena - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь в Athena выводить только пользователей, у которых есть определенное c значение в них, но не во всех строках

Предположим, у меня есть таблица ниже. Я хочу, чтобы все пользователи имели значение «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, но мне не удается сделать это presto. Также я думал о преобразовании строк в столбцы, а затем проверке, равен ли один из столбцов 100.

Эти решения слишком сложные? Кто-нибудь знает, как их реализовать, или у кого-то есть более простое решение?

Ответы [ 3 ]

0 голосов
/ 17 июня 2020

Вы можете использовать подзапрос, как показано ниже, чтобы получить требуемый результат =

SELECT * FROM your_table
WHERE User IN(
    SELECT DISTINCT User
    FROM your_table
    WHERE Value = 100
)
0 голосов
/ 17 июня 2020

Если вам просто нужны пользователи, я бы использовал go для агрегирования:

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

Если 100 - максимально возможное значение, это можно упростить до:

having max(value) = 100
0 голосов
/ 17 июня 2020

Пользователи, у которых есть хотя бы одно значение 100, могут быть найдены с помощью этого SQL:

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)
...