从相同的 table 中减去两个查询
Sustract two queries from same table
假设我有 2 个 table:
tabledevice
是一组测量设备,tabledata
是一组不同类型的设备测量的值。
Table data = (no, id,value_type,value, dayhour) no is PK, id refer to table device
Table device = (id, name) id is PK
我目前有一个查询,该查询将获取 id
在特定日期生成的特定 value_type
的所有值的总和,例如:
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 和第三个减去这两列。
SELECT b.name, a.*, a.sum2 - a.sum3 AS diff
FROM (
SELECT id
, sum(CASE WHEN value_type = 2 THEN value::int END) AS sum2
, sum(CASE WHEN value_type = 3 THEN value::int END) AS sum3
FROM data
WHERE id = 1
AND value_type IN (2, 3)
AND dayhour >= '2015-12-12 0:0'::timestamp
AND dayhour < '2015-12-13 0:0'::timestamp
GROUP BY 1
) a
JOIN device b USING (id);
- 假设
dayhour
是时间戳数据类型(信息缺失)。
迄今为止的转换将禁用基本索引。这就是我将其转换为 sargable 谓词的原因。更多细节:
- Optimize BETWEEN date statement
- 为什么投
value::int
?
- 先聚合,再加入设备。更便宜。
假设我有 2 个 table:
tabledevice
是一组测量设备,tabledata
是一组不同类型的设备测量的值。
Table data = (no, id,value_type,value, dayhour) no is PK, id refer to table device
Table device = (id, name) id is PK
我目前有一个查询,该查询将获取 id
在特定日期生成的特定 value_type
的所有值的总和,例如:
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 和第三个减去这两列。
SELECT b.name, a.*, a.sum2 - a.sum3 AS diff
FROM (
SELECT id
, sum(CASE WHEN value_type = 2 THEN value::int END) AS sum2
, sum(CASE WHEN value_type = 3 THEN value::int END) AS sum3
FROM data
WHERE id = 1
AND value_type IN (2, 3)
AND dayhour >= '2015-12-12 0:0'::timestamp
AND dayhour < '2015-12-13 0:0'::timestamp
GROUP BY 1
) a
JOIN device b USING (id);
- 假设
dayhour
是时间戳数据类型(信息缺失)。 迄今为止的转换将禁用基本索引。这就是我将其转换为 sargable 谓词的原因。更多细节:- Optimize BETWEEN date statement
- 为什么投
value::int
? - 先聚合,再加入设备。更便宜。