#sql #postgresql
#sql #postgresql
Вопрос:
Начиная с конечной цели, я хочу, чтобы результирующий набор выглядел следующим образом:
name | completed
_________________
Josh | T
Tom | T
Harry | F
У меня есть таблица, которая выглядит как:
id | name | status
__________________
1 Josh complete
2 Josh errored
3 Tom generating
4 Tom complete
5 Harry pending
Как вы можете видеть из набора результатов, я хочу знать для каждого пользователя, имел ли он когда-либо статус complete .
Я думаю, что хочу выполнить итерацию по каждой строке в проверке предложения grouped by status = 'complete'
, но я изо всех сил пытаюсь это сделать.
Ответ №1:
Вы могли бы использовать bool_or
агрегатную функцию:
SELECT name, bool_or(status = 'complete')
FROM test
GROUP BY name
выдает
| name | bool_or |
|------- ---------|
| Tom | t |
| Josh | t |
| Harry | f |
Комментарии:
1. Это именно то, что мне нужно.
Ответ №2:
Вы можете выполнить агрегацию :
select name, coalesce(max(case when status = 'complete' then T end), 'F') as completed
from table t
group by name;
Комментарии:
1. Спасибо — Просто чтобы я понял, почему мы используем
max
здесь?2. @JoshHale . . .
max()
даст вамT
значение, еслиstatus = 'complete'
найдено, иначе оно вернетсяnull
, поскольку это агрегированный запрос, поэтому потребуется функция агрегирования, если column (status
) отсутствует сgroup by
предложением.3. Хорошо, это имеет смысл. Спасибо