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

新手上路,请多包涵

正如标题所示,我想选择与 GROUP BY 分组的每组行的第一行。

具体来说,如果我有一个 purchases 表,如下所示:

 SELECT * FROM purchases;

我的输出:

ID顾客全部的1乔5 2莎莉3 3乔2 4莎莉1

我想查询每个 id 的最大购买量( total )的 customer 。像这样的东西:

 SELECT FIRST(id), customer, FIRST(total)
FROM  purchases
GROUP BY customer
ORDER BY total DESC;

预期输出:

第一(身份证)顾客第一(总) 1乔5 2莎莉3

原文由 David Wolever 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.6k
2 个回答

支持 CTE 和窗口函数 的数据库上:

 WITH summary AS (
    SELECT p.id,
           p.customer,
           p.total,
           ROW_NUMBER() OVER(PARTITION BY p.customer
                                 ORDER BY p.total DESC) AS rank
      FROM PURCHASES p)
 SELECT *
   FROM summary
 WHERE rank = 1

任何数据库都支持:

但是您需要添加逻辑来打破关系:

   SELECT MIN(x.id),  -- change to MAX if you want the highest
         x.customer,
         x.total
    FROM PURCHASES x
    JOIN (SELECT p.customer,
                 MAX(total) AS max_total
            FROM PURCHASES p
        GROUP BY p.customer) y ON y.customer = x.customer
                              AND y.max_total = x.total
GROUP BY x.customer, x.total

原文由 OMG Ponies 发布,翻译遵循 CC BY-SA 4.0 许可协议

这就是我们如何通过使用 windows 函数来实现这一点:

     create table purchases (id int4, customer varchar(10), total integer);
    insert into purchases values (1, 'Joe', 5);
    insert into purchases values (2, 'Sally', 3);
    insert into purchases values (3, 'Joe', 2);
    insert into purchases values (4, 'Sally', 1);

    select ID, CUSTOMER, TOTAL from (
    select ID, CUSTOMER, TOTAL,
    row_number () over (partition by CUSTOMER order by TOTAL desc) RN
    from purchases) A where RN = 1;

在此处输入图像描述

原文由 PraveenP 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题