Как найти объединение двух запросов с разными идентификаторами - PullRequest
1 голос
/ 18 июня 2020

У меня есть профиль таблицы, содержащий статус этого профиля, т.е. активная и неактивная заметка, есть несколько неактивных записей статуса для одного csr_id, но наверняка только одна или ни одна запись с активным статусом

таблица для справки: -

id | status    | csr_id |
---+-----------+---------
1  | inactive  |  1
2  | inactive  |  1
3  | inactive  |  1
4  | inactive  |  1
5  | inactive  |  2
6  | inactive  |  2
7  | inactive  |  2
8  | inactive  |  2
9  | active    |  2

запрос для справки: -

(select * from profile where csr_id IN (2,1) AND status = 'active') 
    UNION 
 (select DISTINCT ON (csr_id) *from profile where csr_id IN (2,1) AND status = 'inactive') order by status

Результат: -

id  |  status  | csr_id |
-----+----------+---------------+--------
9   | active   |  2
4   | inactive |  1
8   | inactive |  2

ожидаемый результат: -

id  |  status  | csr_id |
-----+----------+---------
9   | active   |  2
4   | inactive |  1

потому что csr_id 2 активен, то игнорировать неактивную запись для csr_id 2

любое решение?

1 Ответ

0 голосов
/ 18 июня 2020

Вы можете сделать это только с distinct on:

select distinct on (csr_id) p.*
from profile p
order by csr_id, status, id desc

Предложение order by по возрастанию active сначала помещает активные записи, а затем отдает приоритет записи с наибольшим id .

Демонстрация на DB Fiddle :

id | status   | csr_id
-: | :------- | -----:
 4 | inactive |      1
 9 | active   |      2
...