正如標題所示,我想選擇用a組成的每組行的第一行GROUP BY。具體來說,如果我有一個purchases看起來像這樣的表:SELECT * FROM purchases;我的輸出:id | 客戶| 總--- + ---------- + ------ 1 | 喬| 五 2 | 莎莉| 3 3 | 喬| 2 4 | 莎莉| 1我想查詢每個產品id的最大購買量(total)customer。像這樣的東西:SELECT FIRST(id), customer, FIRST(total)FROM purchasesGROUP BY customerORDER BY total DESC;預期產出:FIRST(id)| 客戶| FIRST(總)---------- + ---------- + ------------- 1 | 喬| 五 2 | 莎莉| 3
5 回答

牧羊人nacy
TA貢獻1862條經驗 獲得超7個贊
這是常見的最大n組問題,已經有經過充分測試和高度優化的解決方案。我個人更喜歡Bill Karwin的左連接解決方案(原始帖子中有很多其他解決方案)。
請注意,對于這個常見問題的一堆解決方案可以在大多數官方來源,MySQL手冊中找到!請參閱常見查詢示例::保持某個列的分組最大值的行。

慕妹3242003
TA貢獻1824條經驗 獲得超6個贊
在Postgres中你可以array_agg
像這樣使用:
SELECT customer, (array_agg(id ORDER BY total DESC))[1], max(total)FROM purchasesGROUP BY customer
這將為您id
提供每個客戶最大的購買。
有些事情需要注意:
array_agg
是一個聚合函數,所以它適用GROUP BY
。array_agg
允許您指定作用于自身的排序,因此它不會約束整個查詢的結構。如果您需要執行與默認值不同的操作,還有關于如何對NULL進行排序的語法。構建數組后,我們采用第一個元素。(Postgres數組是1索引的,不是0索引的)。
您可以
array_agg
以類似的方式使用第三個輸出列,但max(total)
更簡單。不同的是
DISTINCT ON
,使用array_agg
讓你保留你的GROUP BY
,以防你出于其他原因。
添加回答
舉報
0/150
提交
取消