如何编写SQL按日期分组统计sentiment字段取值计数以生成情感趋势对比数据
按日期维度统计三类情感计数的SQL实现
核心实现逻辑为条件聚合行转列,按日期分组后对每类情感单独计数,无匹配记录时自动补0,输出结果可直接对接后续可视化需求。
通用兼容写法(适配所有主流关系型数据库)
将代码中的表名替换为你实际存储textid、sentiment、date三个字段的表名即可运行:
SELECT date, SUM(CASE WHEN sentiment = 'positive' THEN 1 ELSE 0 END) AS countPositive, SUM(CASE WHEN sentiment = 'neutral' THEN 1 ELSE 0 END) AS countNeutral, SUM(CASE WHEN sentiment = 'negative' THEN 1 ELSE 0 END) AS countNegative FROM text_data -- 替换为实际表名 GROUP BY date ORDER BY date;
示例数据对应的输出结果
| date | countPositive | countNeutral | countNegative |
|---|---|---|---|
| 2018-10-22 | 1 | 0 | 0 |
| 2019-11-30 | 0 | 1 | 0 |
| 2019-12-29 | 0 | 0 | 1 |
| 2020-01-02 | 1 | 1 | 2 |
| 2021-03-10 | 0 | 0 | 1 |
| 2021-08-10 | 0 | 0 | 1 |
简洁语法版本(适配PostgreSQL、SQLite 3.30+、DuckDB等支持FILTER子句的数据库)
逻辑和通用版本完全一致,可读性更强:
SELECT date, COUNT(*) FILTER (WHERE sentiment = 'positive') AS countPositive, COUNT(*) FILTER (WHERE sentiment = 'neutral') AS countNeutral, COUNT(*) FILTER (WHERE sentiment = 'negative') AS countNegative FROM text_data -- 替换为实际表名 GROUP BY date ORDER BY date;
注意事项
- 字符串匹配为大小写敏感逻辑,如果实际存储的情感值大小写和示例不一致,需要同步调整匹配条件,或通过
LOWER(sentiment) = 'positive'这类写法统一转换为小写后匹配,避免漏统计 - 如果需要调整统计粒度(比如按周、按月汇总),仅需将
GROUP BY date中的日期字段替换为对应粒度的截取结果即可,例如MySQL按统计月的写法为GROUP BY DATE_FORMAT(date, '%Y-%m'),PostgreSQL按统计月的写法为GROUP BY DATE_TRUNC('month', date)
内容的提问来源于stack exchange,提问作者Renato Santos
相关产品推荐
相关产品推荐

