如何合并按国家分组统计总访问量和点击量的两个SQL查询?
解决方案
最优写法(条件聚合,推荐)
仅需一次表扫描即可得到结果,性能更好,同时兼容PostgreSQL和SQLite:
SELECT country, COUNT(*) AS visits, SUM(CASE WHEN clicked = 1 THEN 1 ELSE 0 END) AS clicks FROM arb_visits GROUP BY country ORDER BY visits DESC;
逻辑说明:
COUNT(*)统计每个国家的所有访问记录,和你原逻辑的总访问量计算完全一致SUM(CASE WHEN clicked = 1 THEN 1 ELSE 0 END)逐行判断clicked值,仅统计值为1的条目总数,和你原逻辑的点击量计算完全一致- 注意统一用单等号
=做等值判断,双等号==是SQLite的非标准语法,PostgreSQL不支持,修改后可同时适配两套环境
可选写法(合并两个现有查询)
如果你需要直接合并已有的两个查询逻辑,可以用子查询+LEFT JOIN的方式实现,兼容两套环境:
SELECT v.country, v.visits, COALESCE(c.clicks, 0) AS clicks FROM ( -- 原总访问量查询 SELECT country, count(*) as visits FROM arb_visits GROUP BY country ) v LEFT JOIN ( -- 原点击量查询,已将==改为=适配PG SELECT country, COUNT(*) as clicks FROM arb_visits WHERE clicked = 1 GROUP BY country ) c ON v.country = c.country ORDER BY v.visits DESC;
这个写法需要扫描两次表,性能低于条件聚合写法,仅做逻辑参考。
内容的提问来源于stack exchange,提问作者Rubioli
相关产品推荐
相关产品推荐

