Postgresql: как выбрать из карты несколько значений - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть таблица SOME_DELTA, в которой записываются все связанные со стороной транзакции с изменением суммы. Пример:

1002 *

У меня есть случай, когда MVC контроллер принимает карту someMap (party_id, some_date) и мне нужно получить список part_id с суммированной суммой до указанного c some_date

В этом случае, если я отправлю mapOf ("party_id_1" на Date (2019 - 1 - 15), "party_id_2" на Date (2019 - 1 -) 2)) Я должен получить список party_id с суммированным количеством до some_date

Вывод должен выглядеть следующим образом:

party_id_1 | 70
party_id_2 | 50

В настоящее время код:

select sum(amount) from SOME_DELTA where party_id=:partyId and some_date <= :someDate

Но в этом В случае, если мне нужно выполнить итерацию по карте и выполнить несколько вызовов БД для суммирования суммы для eatch party_id до some_date, что выглядит неправильно

Есть ли более деликатный способ получить один запрос select? (чтобы избежать +100 вызовов БД)

1 Ответ

1 голос
/ 04 февраля 2020

Для этого можно использовать боковое соединение:

select map.party_id, 
       c.amount
from (
  values 
     ('party_id_1', date '2019-01-15'), 
     ('party_id_2', date '2019-01-02')
) map (party_id, cutoff_date)
  join lateral (
    select sum(amount) amount
    from some_delta sd
    where sd.party_id = map.party_id
      and sd.some_date <= map.cutoff_date
  ) c on true
order by map.party_id;

Онлайн пример

...