Сгруппированная разница в PostgreSQL Query - PullRequest
0 голосов
/ 22 ноября 2018

Это довольно простой вопрос, скорее о существовании агрегатной «разностной» функции или что-то эквивалентное в PostgreSQL.Если у меня есть следующая структура для запроса:

id    | value
45572 | 802033.9692
45572 | 395904.2332
45573 | 750143.7240
45573 | 114797.8068
45574 | 357421.6152
45574 | 42223.3203
45576 | 13486.1753
45576 | 961121.1070
45571 | 289127.9147
45571 | 662589.0504
45579 | 900874.5207
45579 | 235575.6564

Естественно, просто агрегировать столбец "value" для "id", используя GROUP BY

select id, sum(value)
  from ...
 where ...
 group by id
 order by id

Мой вопрос, есть ли что-то эквивалентная агрегатная функция, чтобы найти абсолютную разницу в строках «значения» по отношению к каждой паре идентификаторов.В этом примере результат, который я ищу, будет выглядеть примерно так:

id    | value
45572 | 406129.736
45573 | 635345.9172
45574 | 315198.2949
45576 | 947634.9317
45571 | 373461.1357
45579 | 665298.8643

. В этом случае я гарантирую, что будет точно 2 из каждого отдельного значения идентификатора.Это оконная функция, которую я должен использовать здесь?Если так, то я не уверен, где начать.Указатель в правильном направлении наиболее эффективного способа сделать это будет высоко ценится.

1 Ответ

0 голосов
/ 22 ноября 2018

Вы можете использовать MIN/MAX здесь:

SELECT
    id,
    MAX(value) - MIN(value) AS diff
FROM yourTable
GROUP BY
    id;

Если предположить, что каждый id в вашей таблице имеет ровно пару записей, тогда приведенный выше запрос должен дать вам желаемый результат.

...