Итерация по группе в SQL Postgres

Начиная с конечной цели, я хочу, чтобы набор результатов выглядел следующим образом:

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

Как видно из набора результатов, я хочу знать для каждого человека, был ли у него когда-либо статус завершенного. Я думаю, что хочу перебрать каждую строку в проверке предложения group by status = 'complete', но я изо всех сил пытаюсь это сделать.

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
473
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете сделать агрегацию:

select name, coalesce(max(case when status = 'complete' then T end), 'F') as completed
from table t
group by name;

Спасибо. Просто чтобы я понял, почему мы используем здесь max?

Josh Hale 18.04.2019 17:19

@ДжошХейл. . . max() даст вам T значение, если status = 'complete' найдено, иначе он вернет null, поскольку это агрегированный запрос, поэтому потребуется функция агрегирования, если столбец (status) отсутствует с предложением group by.

Yogesh Sharma 18.04.2019 17:23

Хорошо, это имеет смысл. Спасибо

Josh Hale 18.04.2019 17:24
Ответ принят как подходящий

Вы можете использовать bool_or агрегатная функция:

SELECT name, bool_or(status = 'complete')
FROM test
GROUP BY name

урожаи

| name  | bool_or |
|-------+---------|
| Tom   | t       |
| Josh  | t       |
| Harry | f       |

Это именно то, что мне нужно.

Josh Hale 18.04.2019 17:34

Другие вопросы по теме