正如标题所示,我想选择用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
提交
取消