Postgresql
按兩個 ID 分組後,選擇一個 ID 值最高的行
在問題中給出的事件必鬚髮生不止一次,但人 (
PID
) 只能與AID
具有最高的 (代理) 一起選擇BustCount
。SELECT I.AgentID, I.PersonID, Count(*) AS BustCount FROM InvolvedIn I WHERE I.AgentID IS NOT NULL AND I.isCulprit = TRUE GROUP BY I.AgentID, I.PersonID HAVING COUNT(*) > 1;
這是我得到的:
AID PID BustCount 1 11 4 2 22 2 3 22 5 4 33 5 5 44 4
但我只想得到
PID
最高的BustCount
(不是第 2 行)。AID PID BustCount 1 11 4 3 22 5 4 33 5 5 44 4
只需添加即可
DISTINCT ON (PersonID)
在 PostgreSQL 中完成這項工作:SELECT DISTINCT ON (PersonID) AgentID, PersonID, Count(*) AS BustCount FROM InvolvedIn i WHERE AgentID IS NOT NULL AND isCulprit GROUP BY AgentID, PersonID HAVING COUNT(*) > 1 ORDER BY PersonID, BustCount DESC, AgentID;
我添加
AgentID
了(可選)第三個ORDER BY
表達式和決勝局,以便在多個代理具有相同數量的蕭條的情況下獲得確定性結果。適應您的要求。詳細解釋:
我們可以在一個
SELECT
沒有子查詢的情況下完成所有這些,因為DISTINCT ON
是在聚合之後應用的。關於查詢中的事件順序SELECT
:哦,
WHERE isCulprit = TRUE
這只是一種更吵的說法WHERE isCulprit
。
假設
AgentId
從不重複相同的內容,那麼這個查詢應該通過使用視窗函式PID
來完成您正在尋找的內容:ROW_NUMBER()
WITH CTE_PID_HighestBustCount AS ( SELECT AID, PID, BustCount, ROW_NUMBER() OVER (PARTITION BY PID ORDER BY BustCount DESC) AS SortId -- Generates a unique ID for each row within a PID sorted by highest BustCount first FROM InvolvedIn ) SELECT AID, PID, BustCount FROM CTE_PID_HighestBustCount WHERE SortId = 1 -- Filter out everything except the rows with highest BustCount