Postgresql - условие множественного выбора - PullRequest
2 голосов
/ 10 февраля 2020

У меня есть таблица со следующей структурой:

|id|author_id|name|type|created_at|updated_at

Как тип, я могу иметь 5 различных типов (A, B, C, D, E).

I нужен запрос к базе данных по author_id, где я могу выбрать только последнюю обновленную строку «типа» A и B. И выбрать все остальные строки типа.

Таким образом, результат должен быть примерно таким:

| id  | author_id | name  | type | created_at | updated_at
| 12  | 88        | lorem | A
| 45  | 88        | lorem | B
| 44  | 88        | lorem | C
| 154 | 88        | lorem | C
| 98  | 88        | lorem | C
| 856 | 88        | lorem | E
| 857 | 88        | lorem | E

Возможно ли это одним запросом? Или мне нужно использовать два запроса?

Спасибо

Ответы [ 3 ]

1 голос
/ 10 февраля 2020

Вы можете попробовать следующее:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY "type" ORDER BY updated_at DESC) rn
    FROM yourTable
)

SELECT id, author_id, name, "type", created_at, updated_at
FROM cte
WHERE
    ("type" IN ('A', 'B') AND rn = 1) OR
    "type" NOT IN ('A', 'B');

Этот подход использует ROW_NUMBER для поиска последних строк для всех типов. В запросе к CTE мы выбираем только самые последние обновленные строки для типов A и B, но мы выбираем все строки для всех других типов.

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

Я думаю:

(select distinct on (type) t.*
 from t
 where type in ('A', 'B')
 order by type, created_at desc
) union all
select t.*
from t
where type not in ('A', 'B');

В частности, это может хорошо использовать индекс для (type, created_at desc).

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

Предполагая, что id является уникальным ключом в таблице, вы можете сделать это с помощью distinct on:

select distinct on(case when type in ('A', 'B') then type else id::text end) t.*
from mytable t
order by case when type in ('A', 'B') then type else id::text end, created_at desc, id

Это условное выражение используется как ключ distinct on, который возвращает либо type если это A или B, или id для других значений. Таким образом, вы получаете верхнее значение 1 для типов A и B и все другие значения для других типов.

...