亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

選擇每個GROUP BY組中的第一行?

選擇每個GROUP BY組中的第一行?

臨摹微笑 2019-05-21 15:16:27
正如標題所示,我想選擇用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手冊中找到!請參閱常見查詢示例::保持某個列的分組最大值的行


查看完整回答
反對 回復 2019-05-21
?
慕妹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,以防你出于其他原因。


查看完整回答
反對 回復 2019-05-21
  • 5 回答
  • 0 關注
  • 1431 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號