Фильтр для появления 2 значений, которые должны хотя бы существовать 1 раз - PullRequest
0 голосов
/ 13 февраля 2020

Заголовок может быть плохим, не могу придумать лучшего.

Мои данные комментариев, каждый комментарий присваивается учетной записи usernameChannelId:

usernameChannelId | hasTopic | sentiment_sum | commentId
a                 | 1        | 4             | xyxe24
a                 | 0        | 2             | h5hssd
a                 | 1        | 3             | k785hg
a                 | 0        | 2             | j7kgbf
b                 | 1        | -2            | 76hjf2
c                 | 0        | -1            | 3gqash
c                 | 1        | 2             | ptkfja
c                 | 0        | -2            | gbe5gs
c                 | 1        | 1             | hghggd

Мой код:

SELECT u.usernameChannelId, avg(sentiment_sum) sentiment_sum, u.hasTopic
FROM total_comments u
WHERE u.hasTopic is True
GROUP BY u.usernameChannelId
HAVING count(u.usernameChannelId) > 0

UNION

SELECT u.usernameChannelId, avg(sentiment_sum) sentiment_sum, u.hasTopic
FROM total_comments u
WHERE u.hasTopic is False
GROUP BY u.usernameChannelId

Я хочу получить все usernameChannelIds, у которых есть хотя бы 1 комментарий с hasTopi c == 0 и 1 комментарий с hasTopi c == 1 (для статистического сравнения обеих групп и удаления только пользователя, который только прокомментировал видео topi c или offtopi c).

Как я могу фильтровать таким образом?

1 Ответ

0 голосов
/ 13 февраля 2020

Вот маленький трюк, который может помочь. Во-первых, вам нужно ознакомиться с CASE выражением. , вот выдержка из do c.

Выражение CASE

Выражение CASE выполняет роль, аналогичную IF-THEN-ELSE в других языках программирования.

Необязательное выражение, которое находится между ключевым словом CASE и первым ключевым словом WHEN, называется «базовым» выражением. Существует две базовые c формы выражения CASE: с базовым выражением и без.

Выражение типа CASE when hasTopic is False then 1 else 0 END будет иметь значение 1, если hasTopi c равно 0. An выражение для hasTopic is True будет похоже.

Теперь эти CASE можно суммировать, что скажет вам, есть ли у пользователя строки с hasTopi c True и hasTopi c False.

Что-то подобное в предложении hasin может помочь (по одному на каждое значение, конечно)

HAVING SUM(CASE when hasTopic is False then 1 else 0 END) > 0

(необходимо удалить предложение WHERE и запрос UNION будет ненужным).

...