Postgresql

按兩個 ID 分組後,選擇一個 ID 值最高的行

  • March 14, 2021

在問題中給出的事件必鬚髮生不止一次,但人 ( 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

引用自:https://dba.stackexchange.com/questions/286975