Использование SUM с DISTINCT - PullRequest
0 голосов
/ 29 июня 2018

Таблица:

 item    value
  a        1
  a        1
  a        1
  b        2
  b        2
  c        1
  c        1 

Я хочу такой результат

 SUM
  4

Это можно сделать с помощью следующей команды:

SELECT SUM(value)
FROM (
    SELECT DISTINCT ON (item) *
    FROM TABLE
) s 

Но есть ли простая команда для этого? Примерно так:

SELECT SUM(value in DISTINCT(item)) FROM TABLE

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Правильная команда будет:

SELECT SUM(value)
FROM (SELECT DISTINCT ON (item) *
      FROM TABLE
      ORDER BY item
     ) s ;

Значение ORDER BY важно при использовании DISTINCT ON.

Я не могу придумать способ сделать это без подзапроса. Как правило, такие данные будут построены из другого запроса. Суммирование может быть сделано лучше по базовым таблицам, а не по результату. Подсказка: данные не нормализованы.

0 голосов
/ 29 июня 2018

Если учесть, что если item имеет другое значение, то набор результатов будет ошибочным, как указано в комментариях, если вы хотите «упростить» его, вы можете сохранить его в процедуре:

CREATE OR REPLACE FUNCTION sumDiff() RETURNS INTEGER AS $$
        DECLARE
            ress integer;
        BEGIN
            SELECT SUM(value)
            FROM (
                SELECT DISTINCT ON (item) *
                FROM itemvalues
            ) s
            INTO ress;
            RETURN ress;
        END;
$$ LANGUAGE plpgsql;

SELECT sumDiff(); // returns 4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...