PostgreSQL如何按客户产品数量、产品字母序排序输出所有行
解决方案
你可以用PostgreSQL的窗口函数实现需求,无需额外嵌套关联,语法简洁高效:
SELECT "Customer", "Product" FROM 你的表名 -- 替换为实际表名 ORDER BY -- 第一排序规则:按客户关联的产品总数降序 COUNT(*) OVER (PARTITION BY "Customer") DESC, -- 第二排序规则:同客户下产品按字母升序 "Product" ASC;
如果更习惯用子查询先统计数量再关联排序,也可以用下面的写法,效果一致:
SELECT t."Customer", t."Product" FROM 你的表名 t INNER JOIN ( SELECT "Customer", COUNT(1) AS product_count FROM 你的表名 GROUP BY "Customer" ) AS customer_stat ON t."Customer" = customer_stat."Customer" ORDER BY customer_stat.product_count DESC, t."Product" ASC;
说明
- 窗口函数
COUNT(*) OVER (PARTITION BY "Customer")会逐行计算当前行所属客户的关联产品总数,不需要提前分组聚合再关联,性能更优。 - 字段名加双引号是适配PostgreSQL对大小写敏感的字段命名规则,如果你的表字段是小写命名,去掉双引号即可。
内容的提问来源于stack exchange,提问作者Smithy
相关产品推荐
相关产品推荐

