Как рассчитать разницу результирующего набора строк, разделяющих значение? - PullRequest
2 голосов
/ 08 мая 2020

Со следующим набором результатов:

side|timestamp_ms|sum  |
----|------------|-----|
blue|         135| 1000|
red |         135| 1100|
blue|        1943| 2500|
red |        1943| 2900|

Как я могу вычислить разницу сумм между синей и красной сторонами, которые имеют общие отметки времени?

В идеале новый набор результатов должен быть что-то вроде:

timestamp_ms|diff |
------------|-----|
         135| -100|
        1943| -400|

Ответы [ 2 ]

3 голосов
/ 08 мая 2020

Один метод - это join:

select tb.timestamp_ms, tb.sum - tr.sum
from t tr join
     t tb
     on tr.timestamp_ms = tb.timestamp_ms
where tr.side = 'red' and tb.side = 'blue';

Другой метод - условное агрегирование:

select timestamp_ms,
       (sum(t.sum) filter (where t.side = 'blue') -
        sum(t.sum) filter (where t.side = 'red')
       )
from t
group by timestamp_ms
2 голосов
/ 08 мая 2020

Вы можете выполнить условное агрегирование:

select 
    timestamp_ms,
    sum(case side when 'blue' then t.sum when 'red' then -t.sum end) diff
from mytable t
group by timestamp_ms

Это также будет работать, если ваши данные имеют более одного вхождения каждого side на timestamp_ms.

Примечание: sum - ключевое слово языка, поэтому не подходит для имени столбца.

...