见字如面,如标题拆分:
- 分组 GROUP BY field_name
- 统计 COUNT(field_name)
- 去重 DISTINCT field_name
- 条件过滤 CASE WHEN age > 18 THEN age END
示例:
前序:
表结构
CREATE TABLE `data_table_name` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`username` varchar(50) CHARACTER SET utf8 NOT NULL DEFAULT '' COMMENT '用户姓名',
`age` tinyint(3) NOT NULL DEFAULT '0' COMMENT '年龄',
`is_online` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否在线 1:在线 2:离线 ',
`create_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='测试数据表';
表数据:
二、 需求
1、统计所有用户不同年龄段的数量,以年龄为维度分组
select count(age) from data_table_name group by age;
结果1:
2、统计所有用户不同年龄段的数量,以年龄为维度分组且以创建时间去重
select *, count(DISTINCT create_time) from data_table_name group by age;
结果2:
3、统计所有用户不同年龄段的数量,以年龄为维度分组且以创建时间去重,并且创建时间大于 > 1653903132
select *,
count(DISTINCT case when create_time > 1653903132 then create_time end) as num from data_table_name group by age;
结果3:
4、 统计所有用户不同年龄段的数量,以年龄为维度分组且以创建时间去重,并且创建时间大于 > 1653903132 and is_online = 1
select *, count(DISTINCT case when create_time > 1653903132 and is_online = 1 then create_time end) as num from data_table_name group by age;
结果4:
以上,需求千息万变,万变不离其宗。
我为人人,人人为我,美美与共,天下大同。