簡體   English   中英

如何在一列中獲取具有最大值的行?

[英]How to get rows with the greatest value in one column?

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

我想更改或集成我的查詢以僅獲取id的MAX orelez值(我用箭頭表示我想要保留在結果中的元組)。 此外,我希望我的查詢只采用前三個屬性,丟棄最后兩個屬性。

這是上面示例的所需輸出:

nome            | cognome       | NomeFacolta    

Francesco         Bortolan        Medicina    
Giampaolo         Dalle Vedove    Economia    
Mauro             Spera           Scienze      
Mario Rosario     Buffelli        Lettere     
etc ...

如何更改或集成我的查詢來執行此操作?

如果您不想顯示idorelez ,請使用按ID對其進行分組的子查詢,然后顯示所需的列。

SELECT R.nome, R.cognome, R.nomeFacolta
FROM (SELECT 
          F.id, P.nome, P.cognome, F.nomeFacolta, MAX(orelez) as orelez
      FROM 
          Persona P, 
          JOIN Docenza D ON D.id_persona = P.id, 
          JOIN InsErogato IE ON D.id_inserogato = IE.id, 
          JOIN Facolta F ON IE.id_facolta = F.id
      WHERE
          IE2.annoaccademico = '2009/2010'
      GROUP BY 
          F.id, P.nome, P.cognome, F.nomeFacolta) R
ORDER BY 
    R.orelez DESC;

查詢是最有可能不正確。 謂詞:

WHERE  D.orelez = ANY (SELECT MAX(D2.orelez) ...

將包括恰好具有與任何id的最大值相同的orelez行,而不僅僅是相同的id

可以修復:

 WHERE (F.id, D.orelez) = ANY (SELECT F2.id, MAX(D2.orelez) ...

但還有更多。 只有子查詢才限於IE2.annoaccademico = '2009/2010' 外部查詢沒有相同的限制,因此只要orelez匹配,它將返回具有任何 annoaccademico行。 你必須重復謂詞。 可能真的想找到:

annoaccademico = '2009/2010'匹配任何id的最大orelez所有行

但這似乎不太可能。 假設你真的想找到:

每個id一行,最大orelezannoaccademico = '2009/2010'

使用DISTINCT ON可以徹底簡化:

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;

有關NULL值的可能拐角情況以及如何斷開關系的詳細說明和說明:

調試說明

這可能無法產生預期結果的典型原因:

  1. 有更多行具有相同的最大值。 D.orelez價值。 (你想要返回所有這些嗎?那么你需要一個不同的查詢。)
  2. 最大 D.orelez價值不適用於annoaccademico = '2009/2010'
  3. 可以通過連接消除行,而不是在IEF找到匹配。
  4. D.orelez有NULL值 - 按照鏈接答案中的指示添加D.orelez NULLS LAST

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM