2017-01-17 79 views
0

当前尝试在Postgres中定义动态查询。本质上,Join中使用的子查询所进行的筛选取决于每行的结果。这个想法是,查询中的每个“名称”只会根据一组特定的参数返回一个project_id。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是“Monitoring” - 返回那一行
  2. 如果没有,请取最新的一个(正如我在最后一次查询时所做的那样)。

但是,每个资产只能返回一个来自raproject的项目。

编辑: 的预期回报率将是:

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要求