在单条SQL语句中实现去重号码统计与总消息数统计
问题描述
现有一张消息发送记录表,每日产生百万级记录,表结构及示例数据如下:
| Carrier | Numbers Sent Message | Date |
|---|---|---|
| Airtel | 1234567890 | 2024/9/5 |
| Airtel | 1234567890 | 2024/9/5 |
| Airtel | 1234567891 | 2024/9/5 |
| Airtel | 1234567891 | 2024/9/5 |
| Airtel | 1234567891 | 2024/9/5 |
| Tata | 1234567892 | 2024/9/5 |
| Tata | 1234567892 | 2024/9/5 |
| Jio | 1234567893 | 2024/9/5 |
| Jio | 1234567893 | 2024/9/5 |
| Jio | 1234567894 | 2024/9/5 |
需要编写SQL语句,统计得到以下格式的结果:
| Carrier | Unique Number | # of Messages |
|---|---|---|
| Airtel | 2 | 5 |
| Tata | 1 | 2 |
| Jio | 2 | 3 |
SQL解决方案
通过分组统计即可实现需求,使用COUNT(DISTINCT)计算唯一号码数,COUNT(*)统计总消息数:
SELECT Carrier, COUNT(DISTINCT `Numbers Sent Message`) AS `Unique Number`, COUNT(*) AS `# of Messages` FROM your_table_name -- 替换为实际表名 WHERE Date = '2024-09-05' -- 可选:按日期过滤,需匹配表中日期格式 GROUP BY Carrier ORDER BY Carrier;
百万级数据性能优化建议
- 为
Carrier和Date建立联合索引,提升分组与过滤效率:CREATE INDEX idx_carrier_date ON your_table_name(Carrier, Date); - 若
Numbers Sent Message为字符串类型,可考虑转换为数值类型,或为该字段单独建立索引,优化COUNT(DISTINCT)的执行速度。
内容的提问来源于stack exchange,提问作者Ramakrishna Kulkarni
相关产品推荐
相关产品推荐

