我在Postgres中有一个查询:
SELECT DISTINCT P.nome, P.cognome, F.nomeFacolta, F.id, D.orelez FROM Persona P, Docenza D, InsErogato IE, Facolta F WHERE D.id_inserogato = IE.id AND IE.id_facolta = F.id AND D.id_persona = P.id AND D.orelez = ANY ( SELECT MAX(D2.orelez) FROM Facolta F2, Docenza D2, Inserogato IE2 WHERE D2.id_inserogato = IE2.id AND IE2.id_facolta = F2.id AND IE2.annoaccademico = '2009/2010' GROUP BY F2.id) ORDER BY D.orelez DESC;
结果是:
nome | cognome | NomeFacolta | id | orelez | Francesco Bortolan Medicina 7 128000 <--- Giampaolo Dalle Vedove Economia 2 98000 <--- Mauro Spera Scienze 1 87000 <--- Alessandra Salomoni Economia 2 80000 Alessandro Natucci Economia 2 80000 Attilio Boner Medicina 7 80000 Mario Rosario Buffelli Lettere 8 76000 <--- Carlo Capelli Lettere 8 72000 etc ...
我想更改或集成我的查询,以便只获取orelez的MAXid值(我用箭头指示了要保留在结果中的元组)。另外,我希望查询只接受前三个属性,而放弃后两个属性。
这是上述示例所需的输出:
nome | cognome | NomeFacolta Francesco Bortolan Medicina Giampaolo Dalle Vedove Economia Mauro Spera Scienze Mario Rosario Buffelli Lettere etc ...
如何更改或集成查询来执行此操作?
最佳答案
您的查询很可能不正确。谓词:
WHERE D.orelez = ANY (SELECT MAX(D2.orelez) ...
将包含任何与任何orelez最大值相同的id的行,而不只是相同的id。
您可以修复:
WHERE (F.id, D.orelez) = ANY (SELECT F2.id, MAX(D2.orelez) ...
但还有更多只有子查询被限制为IE2.annoaccademico = '2009/2010'。外部查询没有相同的限制,因此只要与annoaccademico匹配,它将返回任何orelez的行。你必须重复这个谓词。你可能真的想找到:
与orelez > id >匹配的最大值的所有行。
但这似乎不大可能。如果你真的想找到:
每一行的最大annoaccademico = '2009/2010'和id
这可以通过orelez从根本上简化:
SELECT DISTINCT ON (F.id) P.nome, P.cognome, F.nomeFacolta FROM Persona P JOIN Docenza D ON D.id_persona = P.id JOIN InsErogato IE ON IE.id = D.id_inserogato JOIN Facolta F ON F.id = IE.id_facolta WHERE IE.annoaccademico = '2009/2010' ORDER BY F.id, D.orelez DESC;
关于可能出现空值的拐角情况以及如何断开连接的详细说明和说明:
Select first row in each GROUP BY group?
调试指令
可能无法产生预期结果的典型原因:
annoaccademico = '2009/2010'中有更多具有相同最大值的行。(你想全部归还吗?然后需要另一个查询。)
DISTINCT ON中的最大值不适用于D.orelez。
行可能会被连接删除,在D.orelez或annoaccademico = '2009/2010'中找不到匹配项。
IE-addF中有空值,如链接答案中所示。
关于sql - 如何在一列中获得最大值(value)的行?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41468602/