Как я могу получить данные через операторы select и subselect или join - PullRequest
1 голос
/ 17 мая 2019

У меня есть эти данные в базе данных postgres:

id type  repair status 
1   0     open
1   1     repaired
2   0     open
3   0     open
3   1     repaired
3   1     repaired
4   1     repaired
5   0     open
5   1     open
5   1     repaired
5   0     open
5   1     repaired
6   1     repaired
6   1     open

Я хочу получить статус всех идентификаторов (идентификатор может быть чем-то вроде книги и т. Д.). Столбец типа означает: 0 не бронируется, 1: бронируется.

Пример ID: 5 я хочу получить только тот тип, который нельзя забронировать, потому что статус восстановления набора данных открыт, а вещь не подлежит бронированию.

Пример ID: 6 Я хочу получить только тот тип, который можно бронировать, потому что, несмотря на статус ремонта, вещь бронируется.

Могу ли я сделать это с помощью одного запроса на выборку (этот запрос может содержать подзапросы или / и объединения)?

Я ожидаю этого результата:

id type  repair status 
1   0 open
2   0 open
3   0 open
4   1 repaired
5   0 open
6   1 open

1 Ответ

1 голос
/ 17 мая 2019

Если вы хотите одну строку на id в Postgres, лучшим решением будет distinct on.Единственный вопрос - ваше order by предложение.

Ваши правила довольно сложно расшифровать.Мое лучшее предположение:

select distinct on (id) t.*
from t
order by id, bookable desc, (status = 'open')::int desc;

В стандартном SQL вы бы изменили order by на:

order by id, bookable desc,
         (case when status = 'open' then 1 else 0 end)
...