(簡化示例)。我有這張桌子:
USER ID | code | sales
1 x 100
1 y 200
1 z 150
2 x 300
2 z 17
2 y 100
對于每個用戶,我只需要顯示最大銷售額的記錄。
USER ID | code | sales
1 y 200
2 x 300
在我擁有的真實表中,它是數百萬條記錄。這樣做最有效的方法是什么?
現在,我為每個用戶找到最大銷售記錄并將其連接起來以查找完整記錄。
SELECT * from T
WHERE sales = (SELECT MAX(sales) FROM T WHERE user_id=outr.user_id)
假設銷售數字不會針對特定用戶重復。
uj5u.com熱心網友回復:
這是我的嘗試:
SELECT T_with_maxsales.user_id,
T_with_maxsales.code,
T_with_maxsales.sales
FROM (SELECT T.*,
MAX(sales) OVER(PARTITION BY user_id) AS max_sales
FROM T) T_with_maxsales
WHERE sales = max_sales
uj5u.com熱心網友回復:
將您的依賴子查詢重構為一個獨立的子查詢,然后加入它。
SELECT T.*
FROM T
JOIN (
SELECT MAX(sales) max_sales, user_id
FROM T
GROUP BY user_id
) M ON T.user_id = M.user_id
AND T.sales = M.max_sales;
子查詢為每個用戶獲得最大的銷售額。JOIN 操作的 ON 子句檢索每個用戶最大銷售的詳細記錄。
在大表上運行時,多列索引(user_id, sales)將使此查詢有效地作業。
這適用于兩者mysql和PostgreSQL.
uj5u.com熱心網友回復:
使用 Postgres,最有效的方法通常是使用distinct on()
select distinct on (user_id) *
from the_table
order by user_id, sales desc;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/475222.html
標籤:mysql sql PostgreSQL 每组最大 n 分组最大值
下一篇:在關系表中顯示至少出現一次的行?
