PostgreSQL查询组由两个“参数”组成

PostgreSQL查询组由两个“参数”组成,sql,postgresql,select,group-by,Sql,Postgresql,Select,Group By,两天来,我一直在尝试解决以下PostgreSQL查询,但都没有成功 假设我有下表: | date | value | ------------------------- | 2018-05-11 | 0.20 | | 2018-05-11 | -0.12 | | 2018-05-11 | 0.15 | | 2018-05-10 | -1.20 | | 2018-05-10 | -0.70 | | 2018-05-10 | -0.16 |

两天来,我一直在尝试解决以下PostgreSQL查询,但都没有成功

假设我有下表:

| date | value | ------------------------- | 2018-05-11 | 0.20 | | 2018-05-11 | -0.12 | | 2018-05-11 | 0.15 | | 2018-05-10 | -1.20 | | 2018-05-10 | -0.70 | | 2018-05-10 | -0.16 | | 2018-05-10 | 0.07 | 我需要找出每天计算正值和负值的查询:

| date | positives | negatives | ------------------------------------------ | 2018-05-11 | 2 | 1 | | 2018-05-10 | 1 | 3 | 我已经能够找出只提取肯定或否定的查询,但不能同时提取两者:

SELECT to_char(table.date, 'DD/MM') AS date
      COUNT(*)                     AS negative
FROM table
WHERE table.date >= DATE(NOW() - '20 days' :: INTERVAL) AND
      value < '0'
GROUP BY to_char(date, 'DD/MM'), table.date
ORDER BY table.date DESC;
能请人帮忙吗?这让我快发疯了。谢谢。

将子句与聚合函数一起使用

SELECT to_char(table.date, 'DD/MM') AS date,
      COUNT(*) FILTER (WHERE value < 0) AS negative,
      COUNT(*) FILTER (WHERE value > 0) AS positive
FROM table
WHERE table.date >= DATE(NOW() - '20 days'::INTERVAL)
GROUP BY 1
ORDER BY DATE(table.date) DESC
将子句与聚合函数一起使用

SELECT to_char(table.date, 'DD/MM') AS date,
      COUNT(*) FILTER (WHERE value < 0) AS negative,
      COUNT(*) FILTER (WHERE value > 0) AS positive
FROM table
WHERE table.date >= DATE(NOW() - '20 days'::INTERVAL)
GROUP BY 1
ORDER BY DATE(table.date) DESC
我只想:

select date_trunc('day', t.date) as dte, 
       sum( (value < 0)::int ) as negatives,
       sum( (value > 0)::int ) as positives
from t
where t.date >= current_date - interval '20 days' 
group by date_trunc('day', t.date),
order by dte desc;
注:

我更喜欢使用date_trunc,而不是转换为字符串来删除时间组件。 您不需要立即使用并转换为日期。您可以只使用当前日期。 当您可以使用interval关键字指定一个间隔时,将字符串转换为间隔似乎很尴尬。 我只想:

select date_trunc('day', t.date) as dte, 
       sum( (value < 0)::int ) as negatives,
       sum( (value > 0)::int ) as positives
from t
where t.date >= current_date - interval '20 days' 
group by date_trunc('day', t.date),
order by dte desc;
注:

我更喜欢使用date_trunc,而不是转换为字符串来删除时间组件。 您不需要立即使用并转换为日期。您可以只使用当前日期。 当您可以使用interval关键字指定一个间隔时,将字符串转换为间隔似乎很尴尬。