我在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/

10-10 04:51