You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,避免日期顺序乱掉。

用你的样本数据测试的话,结果完全符合预期:

datepositivesnegatives
2018-05-1121
2018-05-1013

要是你确实需要显示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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:18:41