2017-01-17 5 views
0

В настоящее время пытается определить динамический запрос в Postgres. По сути, фильтрация, выполняемая подзапросом, используемым в Join, зависит от результатов для каждой строки. Идея заключается в том, что каждое «имя» в запросе будет возвращать только один проект_ид на основе определенного набора параметров.postgres: динамический подзапрос в фильтрации соединений

Основной запрос без фильтрации:

SELECT a.name, rproj.raproject_id, rproj.current_status, rproj.create_date 
FROM focalpoint fp 
JOIN agl_asset a ON a.serial_number::text = fp."RoutineNumber"::text 
JOIN agl_raproject AS rproj ON a.asset_id = rproj.asset_id 
JOIN agl_auditproject AS audit ON rproj.auditproject_id = audit.auditproject_id 
ORDER BY a.name 

Что бы вернуть:

name raproject_id  current_status  create_date 
AssetA 405323966463427000 Review    24/10/2014 18:35 
AssetA 405323966463460000 Review    07/10/2016 14:04 
AssetA 405323966463413000 Risk Identification 28/11/2013 14:16 
AssetA 405323966463413000 Closed    21/11/2013 17:33 
AssetB 405323966463412000 Monitoring   15/11/2013 11:26 
AssetB 405323966463427000 Review    24/10/2014 18:35 
AssetB 405323966463461000 Assessment   13/10/2016 10:32 
AssetB 405323966463412000 Closed    15/11/2013 11:44 

Но я хочу только один «проект» в актив. Если бы я просто пытался получить «новейший» на основе create_date было бы:

SELECT a.name, rproj.raproject_id, rproj.current_status, rproj.create_date 
FROM focalpoint fp 
JOIN agl_asset a ON a.serial_number::text = fp."RoutineNumber"::text 
JOIN agl_raproject AS rproj ON a.asset_id = rproj.asset_id AND rproj.create_date = ((SELECT max(rproj2.create_date) AS max 
FROM agl_raproject rproj2 
JOIN agl_auditproject audit ON rproj2.auditproject_id = audit.auditproject_id 
WHERE a.asset_id = rproj2.asset_id AND audit.project_type::text = 'ngERMAssessment'::text)) 
JOIN agl_auditproject AS audit ON rproj.auditproject_id = audit.auditproject_id 
ORDER BY a.name 

Но что мне нужно:

  1. Если есть проект, для этого конкретного актива, где current_status - «Мониторинг» - возвращает ту строку
  2. Если нет, возьмите самую новую (как я уже делал по последнему запросу).

Но опять же, только один проект из raproject должен быть возвращен на актив.

EDIT: ожидаемый доход будет:

name raproject_id  current_status  create_date 
AssetA 405323966463460000 Review    07/10/2016 14:04 
AssetB 405323966463412000 Monitoring   15/11/2013 11:26 

ответ

1

distinct on

select distinct on (a.name) 
    a.name, rproj.raproject_id, rproj.current_status, rproj.create_date 
from 
    focalpoint fp 
    inner join 
    agl_asset a on a.serial_number::text = fp."RoutineNumber"::text 
    inner join 
    agl_raproject as rproj on a.asset_id = rproj.asset_id 
    inner join 
    agl_auditproject as audit on rproj.auditproject_id = audit.auditproject_id 
order by a.name, rproj.current_status <> 'Monitoring', rproj.create_date desc 

Проверьте order by требование

Смежные вопросы