2016-11-18 112 views
1

我有以下子查询:PostgreSQL的聚合函数选择2个对应的字段

LEFT OUTER JOIN 
(
    SELECT 
     MAX(testresult."testdate") AS beforeresult, 
     testschedule."test_id", 
     testschedule."asset_id", 
     testschedule."testdate" AS testdate, 
     testschedule."testresult_id" as scheduleresult_id           
    FROM 
     "public"."testresult" testresult 
     INNER JOIN "public"."testschedule" testschedule 
      ON testschedule."asset_id" = testresult."asset_id" 
      AND testschedule."test_id" = testresult."test_id" 
    WHERE 
     "testresult"."client_id" = 25368272 
     AND testresult."testdate" < testschedule."mintolerancedate" 
     AND testschedule."testdate" > '2016-10-01' 
     AND testschedule."testdate" < '2016-10-20' 
    GROUP BY 
     testschedule."asset_id", 
     testschedule."test_id", 
     testschedule."testdate", 
     testschedule."testresult_id" 
    ORDER BY MAX(testresult."testdate") 
) lasttr 
    ON "testschedule"."asset_id" = lasttr."asset_id" 
    AND "testschedule"."test_id" = lasttr."test_id" 
    AND testschedule."testdate" = lasttr.testdate 

这给了我正确的testdate。但是,我还需要与日期对应的testchedule。“testresult_id”。有没有办法从上面的查询中选择这个?

在此先感谢

回答

0

您可以用窗口的功能,或在最近的版本不甘示弱,做了左侧加入:

LEFT JOIN LATERAL 
(SELECT ts."test_id", ts."asset_id", ts."testdate" AS testdate, ts."testresult_id" as scheduleresult_id, 
     tr.* 
FROM "public"."testresult" tr INNER JOIN 
     "public"."testschedule" ts 
     ON ts."asset_id" = tr."asset_id" and ts."test_id" = tr."test_id" 
WHERE tr."client_id" = 25368272 AND 
     tr."testdate" < ts."mintolerancedate" AND 
     ts."testdate" > '2016-10-01' and ts."testdate" < '2016-10-20' AND 
     "testschedule"."asset_id" = ts."asset_id" AND 
     "testschedule"."test_id" = ts."test_id" 
ORDER BY tr."testdate" DESC 
FETCH FIRST 1 ROW ONLY 
) lasttr 

横向联接是像FROM子句中的相关子查询。您可以根据需要返回任意数量的列。没有ON子句,因为连接条件位于子查询的WHERE子句中。

+0

感谢您的快速响应,但我仍然没有收到testschedule。“testresult_id”字段。基本上它需要以某种方式加入到testdate的MAX聚合函数中,但我似乎无法做到这一点 - 我的猜测是我忽略了一些简单的东西。 – user3075171

+0

您不需要再次加入。侧向连接应该做你想要的。 –

+0

所以我在每行之前加上“and”:“testschedule”。“”asset_id“= ts。”asset_id“ ”testschedule“。”test_id“= ts。”test_id“然后当我运行这个时,当添加group by子句时,我得到“输入结束时的语法错误”。如果我添加“ON”子句,那么它会运行,但不会给出每个组的结果。 – user3075171