按年月统计布尔值数量及false/true比率的SQL查询问题
正确查询语句实现
适配支持date_trunc的数据库(PostgreSQL、Redshift、Spark SQL等)
WITH monthly_alive_stats AS ( SELECT DATE_TRUNC('month', "timestamp") AS month_begin, COUNT(CASE WHEN alive = true THEN 1 END) AS true_count, COUNT(CASE WHEN alive = false THEN 1 END) AS false_count FROM 替换为你的实际表名 GROUP BY DATE_TRUNC('month', "timestamp") ) SELECT UPPER(TO_CHAR(month_begin, 'MON-YYYY')) AS "Period", true_count AS "True", false_count AS "False", ROUND( CASE WHEN true_count = 0 THEN NULL ELSE false_count::NUMERIC / true_count END, 2 ) AS "false/true" FROM monthly_alive_stats ORDER BY month_begin ASC;
MySQL适配版本(不支持date_trunc场景)
SELECT UPPER(DATE_FORMAT(`timestamp`, '%b-%Y')) AS `Period`, SUM(alive = TRUE) AS `True`, SUM(alive = FALSE) AS `False`, ROUND( IF(SUM(alive = TRUE) = 0, NULL, SUM(alive = FALSE)/SUM(alive = TRUE)), 2 ) AS `false/true` FROM 替换为你的实际表名 GROUP BY DATE_FORMAT(`timestamp`, '%Y-%m') ORDER BY DATE_FORMAT(`timestamp`, '%Y-%m') ASC;
之前报错的常见原因
timestamp是SQL保留关键字,字段名如果是这个需要用引号/反引号包裹,避免语法解析错误- 没有处理true计数为0的场景,触发除以0的报错
- 直接用整数做除法,得到的结果会自动取整丢失小数位,需要先转成数值类型再计算
- 日期格式化参数不匹配你用的数据库语法,导致输出格式不对
内容的提问来源于stack exchange,提问作者Katty_one
相关产品推荐
相关产品推荐

