猿问

选择每个GROUP BY组中的第一行?

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

GROUP BY customer

ORDER BY total DESC;

预期产出:


FIRST(id)| 客户| FIRST(总)

---------- + ---------- + -------------

        1 | 乔| 五

        2 | 莎莉| 3


临摹微笑
浏览 1412回答 5
5回答

牧羊人nacy

这是常见的最大n组问题,已经有经过充分测试和高度优化的解决方案。我个人更喜欢Bill Karwin的左连接解决方案(原始帖子中有很多其他解决方案)。请注意,对于这个常见问题的一堆解决方案可以在大多数官方来源,MySQL手册中找到!请参阅常见查询示例::保持某个列的分组最大值的行。

慕妹3242003

在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,以防你出于其他原因。
随时随地看视频慕课网APP

相关分类

MySQL
我要回答