无SQL经验如何统计志愿者及团队日均联络人数并做跨区域数据对比
我们默认你的联络记录表名为
volunteer_contacts,如果实际表名不同,替换语句中的表名即可。涉及的字段对应你提到的:volunteer(志愿者唯一编号)、contacts(联络发生的时间戳)、contact_id(联络记录主键,唯一标识每条联络)
如果你的需求是统计日均联络的不同人数,需要确认表中是否有被联络人的唯一标识字段,将COUNT(contact_id)替换为COUNT(DISTINCT 被联络人字段名)即可,下述语句逻辑保持不变
1. 每位志愿者的日均联络数据统计
计算逻辑:先统计每个志愿者每天的联络总次数,再除以该志愿者有产生联络的天数(如果需要按整个统计周期的总天数计算,可调整分母逻辑)
SELECT volunteer AS 志愿者编号, -- 总联络次数 / 有联络的天数 = 日均联络次数 COUNT(contact_id) / COUNT(DISTINCT DATE(contacts)) AS 个人日均联络次数, COUNT(contact_id) AS 统计周期内总联络次数, COUNT(DISTINCT DATE(contacts)) AS 有联络的天数 FROM volunteer_contacts -- 如果需要指定统计时间范围,打开下面的注释填入时间即可 -- WHERE contacts >= '2024-01-01' AND contacts < '2024-07-01' GROUP BY volunteer;
你只需要替换为实际表名,需要限定统计时间的话把WHERE语句的注释打开,改成你要的时间范围即可,执行后就能得到每个志愿者的日均数据。
2. 整个团队的日均联络数据统计
计算逻辑:统计全团队在统计周期内的总联络次数,除以统计周期内至少有1次联络产生的天数
SELECT COUNT(contact_id) / COUNT(DISTINCT DATE(contacts)) AS 团队整体日均联络次数, COUNT(contact_id) AS 统计周期内团队总联络次数, COUNT(DISTINCT DATE(contacts)) AS 统计周期内有产生联络的总天数 FROM volunteer_contacts -- 同上面的时间范围筛选逻辑,需要时打开注释即可 -- WHERE contacts >= '2024-01-01' AND contacts < '2024-07-01';
执行后直接得到整个团队的平均数值,时间筛选规则同上。
3. 方便后续和其他数据JOIN的预计算视图
如果后续需要频繁用这些均值和区域经理等其他数据关联,可以直接创建视图,后续JOIN时直接调用视图即可,不用重复写统计逻辑:
-- 创建志愿者个人日均数据视图 CREATE VIEW volunteer_daily_avg AS SELECT volunteer, COUNT(contact_id) / COUNT(DISTINCT DATE(contacts)) AS volunteer_avg_contacts FROM volunteer_contacts GROUP BY volunteer; -- 后续和其他表JOIN示例,假设区域经理数据表名为area_manager_data,关联字段为volunteer SELECT * FROM area_manager_data a LEFT JOIN volunteer_daily_avg v ON a.volunteer = v.volunteer;
视图创建一次就可以长期使用,后续关联其他数据的时候直接调用视图名即可,不用再重复写统计逻辑。
内容的提问来源于stack exchange,提问作者Ricky Harrison
相关产品推荐
相关产品推荐

