简体   繁体   English

Postgresql:如何从多个值的映射中进行选择

[英]Postgresql: how to select from map of multiple values

I have a SOME_DELTA table which records all party related transactions with amount change Ex.:我有一个 SOME_DELTA 表,它记录了金额变化的所有相关方交易,例如:

PARTY_ID   | SOME_DATE  | AMOUNT
--------------------------------
party_id_1 | 2019-01-01 | 100
party_id_1 | 2019-01-15 | 30
party_id_1 | 2019-01-15 | -60
party_id_1 | 2019-01-21 | 80
party_id_2 | 2019-01-02 | 50
party_id_2 | 2019-02-01 | 100

I have a case where where MVC controller accepts map someMap(party_id, some_date) and I need to get part_id list with summed amount till specific some_date我有一个案例,其中 MVC 控制器接受 map someMap(party_id, some_date) 并且我需要获取具有总和的 part_id 列表,直到特定的 some_date

In this case if I send mapOf("party_id_1" to Date(2019 - 1 - 15), "party_id_2" to Date(2019 - 1 - 2)) I should get list of party_id with summed amount till some_date在这种情况下,如果我发送 mapOf("party_id_1" to Date(2019 - 1 - 15), "party_id_2" to Date(2019 - 1 - 2)) 我应该得到 party_id 的列表,总金额直到 some_date

Output should look like:输出应如下所示:

party_id_1 | 70
party_id_2 | 50

Currently code is:目前代码是:

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

But in this case I need to iterate through map and do multiple DB calls for summed amount for eatch party_id till some_date which feels wrong但在这种情况下,我需要遍历 map 并为 eatch party_id 直到 some_date 进行多次数据库调用以求总和,这感觉不对

Is there a more delicate way to get in one select query?有没有更微妙的方式来进入一个选择查询? (to avoid +100 DB calls) (避免 +100 DB 调用)

You can use a lateral join for this:您可以为此使用横向连接:

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;

Online example 在线示例

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM