从同一个表中删除两个查询

问题描述 投票:0回答:1

假设我有两张桌子: 表

device
是一组测量设备,表
data
是一组由设备测量的不同类型的值。

Table data = (no, id,value_type,value, dayhour) no is PK, id refer to table device
Table device = (id, name) id is PK

我目前有一个查询,该查询将获取由

value_type
在特定日期生成的特定
id
的所有值的总和,例如:

SELECT SUM(cast(a.value as int)),b.name FROM data a INNER JOIN device b
ON a.id=b.id 
AND a.id=1
AND a.value_type=2
AND date(a.dayhour)='2015-12-12'
GROUP BY b.name

查询工作没有问题。现在我希望能够减去不同值类型的总和。我目前正在做的是两个查询,一个用于获取

value_type
2 的总和,另一个用于获取
value_type
3 的总和,然后在上层进程中进行减法。

但是,我想从单个查询中执行此操作,就像一个查询将检索总和为

value_type
2 的一列,另一列总和为
value_type
3,第三个列减去这些列2 列。

sql postgresql aggregate-functions subtraction
1个回答
2
投票
SELECT b.name, a.*, a.sum2 - a.sum3 AS diff
FROM  (
    SELECT id
         , sum(value::int) FILTER (WHERE value_type = 2) AS sum2
         , sum(value::int) FILTER (WHERE value_type = 3) AS sum3
    FROM   data
    WHERE  id = 1
    AND    value_type IN (2, 3)
    AND    dayhour >= '2015-12-12'::timestamp
    AND    dayhour <  '2015-12-13'::timestamp
    GROUP  BY 1
    ) a
JOIN   device b USING (id);

假设

dayhour
的数据类型为
timestamp

转换为
date
将禁用基本索引。使用 sargable 谓词来代替,如演示。参见:

使用聚合

FILTER
子句进行条件聚合(自 Postgres 9.4 起)。参见:

为什么要选演员

value::int

先聚合,再加入设备。更便宜。

© www.soinside.com 2019 - 2024. All rights reserved.