В настоящее время пытается определить динамический запрос в 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
Но что мне нужно:
- Если есть проект, для этого конкретного актива, где current_status - «Мониторинг» - возвращает ту строку
- Если нет, возьмите самую новую (как я уже делал по последнему запросу).
Но опять же, только один проект из 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