PostgreSQL按日期统计正负值数量的查询求助
搞定PostgreSQL按日期统计正负值数量的问题
嘿,折腾两天写不出正确查询确实闹心,这就帮你解决!你需要的是条件聚合——用它就能在一次查询里同时统计每日的正值和负值数量,比分开查高效多了。
先给你直接能用的正确查询:
SELECT date, COUNT(CASE WHEN value > 0 THEN 1 END) AS positives, COUNT(CASE WHEN value < 0 THEN 1 END) AS negatives FROM your_table WHERE date >= NOW() - INTERVAL '20 days' GROUP BY date ORDER BY date DESC;
给你拆解下关键细节:
COUNT(CASE WHEN ... THEN 1 END):这个是核心!当value满足条件(比如大于0)时,返回1;不满足的话返回NULL。而COUNT函数会自动忽略NULL值,刚好统计出符合条件的记录数。- 原查询里你写了
value < '0',这里要注意:value是数值类型,直接和数值0比就行,别加引号!加引号会让PostgreSQL把它当成字符串比较,容易出问题。 - 分组的时候直接用原始的
date字段,比用to_char(date, 'DD/MM')分组更稳妥——如果后续需要格式化日期显示,在SELECT里加to_char(date, 'DD/MM') AS formatted_date就行,但分组和排序还是用原始date,避免日期顺序乱掉。
用你的样本数据测试的话,结果完全符合预期:
| date | positives | negatives |
|---|---|---|
| 2018-05-11 | 2 | 1 |
| 2018-05-10 | 1 | 3 |
要是你确实需要显示DD/MM格式的日期,就用下面这个版本:
SELECT to_char(date, 'DD/MM') AS formatted_date, date, -- 留着原始date用来排序,保证日期顺序正确 COUNT(CASE WHEN value > 0 THEN 1 END) AS positives, COUNT(CASE WHEN value < 0 THEN 1 END) AS negatives FROM your_table WHERE date >= NOW() - INTERVAL '20 days' GROUP BY date, to_char(date, 'DD/MM') ORDER BY date DESC;
这样就完美解决你的问题啦!
内容的提问来源于stack exchange,提问作者jrance
相关产品推荐
相关产品推荐

