如何在PostgreSQL SELECT查询结果中仅显示一次总行数?
解决方案
你可以通过UNION ALL拼接两个结果集实现需求,以下是不同场景的实现方案:
方案1:完全匹配期望的输出格式
如果需要第一行单独展示总行数,后续每行展示retry_count和对应次数,直接统一输出为字符串即可:
SELECT result_line FROM ( -- 第一行:总行数,排序优先级最高 SELECT 1 AS sort_flag, count(*)::TEXT AS result_line FROM sync.request UNION ALL -- 后续行:各retry_count的统计结果 SELECT 2 AS sort_flag, CONCAT(retry_count, ' ', count(retry_count)) AS result_line FROM sync.request GROUP BY retry_count ) t ORDER BY sort_flag;
方案2:保留结构化列输出
如果需要保留两列的结构化查询结果,只把第一行的第二列留空,可以用以下写法:
SELECT col1, col2 FROM ( SELECT 1 AS sort_flag, count(*) AS col1, NULL AS col2 FROM sync.request UNION ALL SELECT 2 AS sort_flag, retry_count::BIGINT, count(retry_count) FROM sync.request GROUP BY retry_count ) AS combined_result ORDER BY sort_flag, col1;
方案3:大表性能优化版
上述两种方案都会扫描两次全表,数据量较大时可以用CTE复用统计结果,仅扫描一次表即可完成计算:
WITH retry_stats AS ( SELECT retry_count, count(*) AS cnt FROM sync.request GROUP BY retry_count ), total AS ( -- 直接从分组结果求和得到总行数,无需二次扫表 SELECT sum(cnt) AS total_cnt FROM retry_stats ) SELECT total_cnt AS col1, NULL AS col2 FROM total UNION ALL SELECT retry_count::BIGINT, cnt FROM retry_stats ORDER BY col1 NULLS FIRST;
内容的提问来源于stack exchange,提问作者SudoGaron
相关产品推荐
相关产品推荐

