如何按指定条件对字段计数,实现日期分组多维度统计
按指定分组维度做多条件计数的实现
核心逻辑是:以date为分组维度,单次扫描数据即可完成所有统计指标的计算,无需对同一数据多次做重复筛选。
常见实现方式
1. SQL 实现
利用聚合函数结合条件判断,仅对满足指定条件的行做计数,有两种常用写法:
- 兼容所有数据库的
CASE WHEN写法:通过COUNT()自动跳过NULL值的特性,不满足条件的行返回NULL即可不被计入SELECT date, COUNT(train) AS `train count`, -- 统计condition1 > 0的行数 COUNT(CASE WHEN condition1 > 0 THEN 1 END) AS `condition1 > 0`, -- 统计condition2为true的行数 COUNT(CASE WHEN condition2 = true THEN 1 END) AS `condition2 is true`, -- 统计满足组合条件的行数 COUNT(CASE WHEN condition1 > 0 AND condition2 = false THEN 1 END) AS `condition1 > 0 and condition2 is false` FROM 你的原始数据表 GROUP BY date - 支持布尔隐式转换的数据库(MySQL、PostgreSQL等)可以简化为
SUM()写法:布尔判断的结果会自动转换为1(true)和0(false),求和后就是满足条件的行数SELECT date, COUNT(train) AS `train count`, SUM(condition1 > 0) AS `condition1 > 0`, SUM(condition2 = true) AS `condition2 is true`, SUM(condition1 > 0 AND condition2 = false) AS `condition1 > 0 and condition2 is false` FROM 你的原始数据表 GROUP BY date
注意:按照你给出的原始明细数据计算,date=1分组的实际统计结果应为:总train数3、condition1>0的有2条、condition2为true的有1条、组合条件满足的有1条;date=2分组的统计结果为总train数1、各条件计数1、1、0,你给出的期望表数值与实际逻辑反向,可以核对下统计规则。
2. Pandas 实现
适合本地Python环境下的数据统计,分组后聚合即可完成计算,数据量大时优先选择提前构造标记列的写法,避免lambda嵌套带来的性能开销:
- 先对每一行打条件标记,满足条件记1,不满足记0
import pandas as pd # 读取原始数据到df中 df['cond1_gt0_flag'] = (df['condition1'] > 0).astype(int) df['cond2_true_flag'] = (df['condition2'] == True).astype(int) df['comb_cond_flag'] = ((df['condition1'] > 0) & (df['condition2'] == False)).astype(int) - 按date分组聚合所有指标
stat_result = df.groupby('date').agg( train_count=('train', 'count'), condition1_gt0=('cond1_gt0_flag', 'sum'), condition2_is_true=('cond2_true_flag', 'sum'), comb_cond_count=('comb_cond_flag', 'sum') ).reset_index()
内容的提问来源于stack exchange,提问作者Pythoner
相关产品推荐
相关产品推荐

