postgresql 对数组中的每个元素执行查询

8zzbczxx  于 2022-11-04  发布在  PostgreSQL
关注(0)|答案(2)|浏览(161)

假设我有以下表:

create table user (    
  id int     
);    

create table transaction (    
  user_id int,    
  date timestamp,    
  amount int    
);

我有一个包含100个用户的数组(来自另一个查询),我想从输入数组中获取每个用户的最后100个事务。
我已经尝试过在脚本中使用for循环 Package 一个简单的查询,但我认为在纯SQL中使用where in一定有办法做到这一点。

p3rjfoxz

p3rjfoxz1#

SELECT u.user, t.date, t.amount
  FROM unnest(user_array :: integer[]) AS u(user)
 CROSS JOIN LATERAL
     ( SELECT date, amount
         FROM transaction AS t
        WHERE t.user_id = u.user
        ORDER BY date DESC
        LIMIT 100
     ) AS t
 ORDER BY u.user, t.date DESC
fsi0uk1n

fsi0uk1n2#

您可以使用窗口函数:

select ut.user_id, ut."date", ut.amount
from (
  select t.user_id. t."date", t.amount, 
         row_number() over (partition by t.user_id order by t."date" desc) as rn
  from "transaction" t
  where t.user_id = any(<your array here>)
) ut
where ut.rn <= 100
order by ut.user_id, ut."date" desc

但是,如果该数组是另一个查询的结果,则不需要以数组开始。

where t.user_id in (... your other query here ...)

相关问题