2015-02-10 3 views
1

Предположим, у меня есть 2 таблицы: Таблица device представляет собой набор измерительных приборов, таблица data представляет собой набор значений различных типов, измеренных устройствами.Sustract два запроса из того же стола

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 колонны.

+0

Просьба указать правильные определения таблиц: что вы получаете с '\ d tbl' в psql или исходных сценариях CREATE TABLE. Кроме того, как * always *: ваша версия Postgres. –

ответ

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

Смежные вопросы