2015-02-10 94 views
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之和第三個與這兩個減法列。

+0

請提供適當的表格定義:在psql中使用'\ d tbl'或原始的'CREATE TABLE'腳本得到的結果。另外,作爲*永遠*:你的Postgres版本。 – 2015-02-10 02:42:08

回答

1
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謂詞。更多細節:
  • 爲什麼投value::int
  • 先彙總,然後加入設備。便宜。
+0

謝謝!這正是我需要的。我一直在玩CASE聲明,但沒有找到正確的語法 – user3851205 2015-02-10 03:22:30