Запрос Redshift для идентификации пользователей, принадлежащих к конкретным группам - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть таблица красного смещения (user_group), которая выглядит как

user_id | group_id
--------+---------
1       | 1
1       | 2
2       | 1
2       | 3
3       | 2
3       | 3
4       | 4

Каков наилучший способ написать запрос, который возвращает всех пользователей (user_id), которые принадлежат к некоторому произвольному подмножеству групп(group_id)?

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

SELECT DISTINCT user_id
FROM
    user_group
WHERE
    user_id IN (SELECT DISTINCT user_id FROM user_group WHERE group_id = 1)
    AND user_id IN (SELECT DISTINCT user_id FROM user_group WHERE group_id = 5)
    ...

И, похоже, тамдолжно быть лучше?

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Используйте GROUP BY и HAVING:

SELECT user_id
FROM user_group
WHERE group_id IN (1, 5)
GROUP BY user_id
HAVING COUNT(*) = 2;  -- number of groups in the `IN` list
0 голосов
/ 29 ноября 2018

Пользователи, принадлежащие к ЛЮБОЙ указанной группе:

SELECT DISTINCT
  user_id
FROM user_group
WHERE group_id in (1, 5)

Пользователи, принадлежащие к ALL перечисленным группам:

SELECT
  user_id
FROM user_group
GROUP BY user_id
HAVING SUM(CASE WHEN group_id = 1 THEN 1 END) > 0
   AND SUM(CASE WHEN group_id = 2 THEN 1 END) > 0
...