![](/img/trans.png)
[英]how to get the column name of the greatest value by using greatest function postgresql?
[英]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 ...
如何更改或集成我的查詢來執行此操作?
如果您不想顯示id
和orelez
,請使用按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
一行,最大orelez
和annoaccademico = '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值的可能拐角情況以及如何斷開關系的詳細說明和說明:
這可能無法產生預期結果的典型原因:
D.orelez
價值。 (你想要返回所有這些嗎?那么你需要一個不同的查詢。) D.orelez
價值不適用於annoaccademico = '2009/2010'
。 IE
或F
找到匹配。 D.orelez
有NULL值 - 按照鏈接答案中的指示添加D.orelez
NULLS LAST
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.