【问题标题】:Postgresql: how to select from map of multiple valuesPostgresql:如何从多个值的映射中进行选择
【发布时间】:2020-02-04 07:22:04
【问题描述】:

我有一个 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

我有一个 MVC 控制器接受 map someMap(party_id, some_date) 的情况,我需要获取 part_id 列表,其中包含直到特定 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

但在这种情况下,我需要遍历 map 并执行多个 DB 调用,以获取eatch party_id 的总和,直到 some_date 感觉不对

有没有更精细的方法来获取一个选择查询? (避免 +100 DB 调用)

【问题讨论】:

    标签: sql postgresql multiple-value


    【解决方案1】:

    您可以为此使用横向连接:

    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

    【讨论】:

      猜你喜欢
      • 2014-01-29
      • 2021-09-14
      • 1970-01-01
      • 2011-11-22
      • 1970-01-01
      • 2021-02-09
      • 2022-01-17
      • 1970-01-01
      • 2023-03-08
      相关资源
      最近更新 更多