Перебор группы по в SQL Postgres

#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. Хорошо, это имеет смысл. Спасибо