Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PostgreSQL中编写具有两个表输入和一个表输出的函数?_Postgresql_Function - Fatal编程技术网

如何在PostgreSQL中编写具有两个表输入和一个表输出的函数?

如何在PostgreSQL中编写具有两个表输入和一个表输出的函数?,postgresql,function,Postgresql,Function,我想创建一个可以创建一个表的函数,其中部分列是从其他两个表派生的 输入表1: 这是每个贷款的静态表。每个贷款只有一行包含与该贷款相关的信息。例如,原始未付余额、原始利率 | id | loan_age | ori_upb | ori_rate | ltv | | --- | -------- | ------- | -------- | --- | | 1 | 360 | 1500 | 4.5 | 0.6 | | 2 | 360 | 2000

我想创建一个可以创建一个表的函数,其中部分列是从其他两个表派生的

输入表1: 这是每个贷款的静态表。每个贷款只有一行包含与该贷款相关的信息。例如,原始未付余额、原始利率

| id  | loan_age | ori_upb | ori_rate | ltv |
| --- | -------- | ------- | -------- | --- |
| 1   | 360      | 1500    | 4.5      | 0.6 |
| 2   | 360      | 2000    | 3.8      | 0.5 |
输入表2: 这是每个贷款的动态表。每笔贷款都有一行,显示每月的贷款绩效。例如,当前未付余额、当前利率、退出状态

| id | month| cur_upb | cur_rate |status|
| ---| ---  | ------- | -------- | ---  |
| 1  | 01   | 1400    | 4.5      | 0    |
| 1  | 02   | 1300    | 4.5      | 0    |
| 1  | 03   | 1200    | 4.5      | 1    |
| 2  | 01   | 2000    | 3.8      | 0    |
| 2  | 02   | 1900    | 3.8      | 0    |
| 2  | 03   | 1900    | 3.8      | 1    |
| 2  | 04   | 1900    | 3.8      | 2    |
输出表: 输出表包含来自表1和表2的信息。Payoffupb是表2中cur_upb的最后一条记录。此表用于模型开发

| id | loan_age | ori_upb | ori_rate | ltv | payoffmonth| payoffupb | payoffrate |lastStatus | modification |
| ---| -------- | ------- | -------- | --- | ---------- | --------- | ---------- |---------- | ------------ |
| 1  | 360      | 1500    | 4.5      | 0.6 |   03       | 1200      |  4.5       |  1        |  null        |
| 2  | 360      | 2000    | 3.8      | 0.5 |   04       | 1900      |  3.8       |  2        |  null        |
输出表中的大多数列可以直接从两个输入表中的列获取或传输,但有些列无法获取,然后留空

我的主要问题是如何编写一个函数,将两个表作为输入并输出另一个表?
我已经在2018年为数据文件编写了功能转换部分,但我需要在其他几年为数据文件再次做同样的事情。这就是为什么我想创建一个函数来简化工作。

当您想针对
表1
的每个条目插入
表2
的最新条目时,请尝试以下操作

    insert into table3 (id,  loan_age,  ori_upb,  ori_rate,  ltv,  
                        payoffmonth, payoffupb,  payoffrate, lastStatus )
    select distinct on (t1.id) 
           t1.id, t1.loan_age, t1.ori_upb, t1.ori_rate, t1.ltv, t2.month, t2.cur_upb,
           t2.cur_rate, t2.status 
    from 
        table1 t1 
    inner join 
        table2 t2 on t1.id=t2.id 
    order by t1.id , t2.month desc

编辑更新后的问题:

考虑到表1、表2、表3的结构将始终相同,执行上述操作的函数将始终相同

create or replace function insert_values(table1 varchar, table2 varchar, table3 varchar)
returns int as $$
declare 
count_ int;
begin

execute format('insert into %I (id,  loan_age,  ori_upb,  ori_rate,  ltv,  payoffmonth, payoffupb,  payoffrate, lastStatus )
select distinct on (t1.id) t1.id, t1.loan_age, t1.ori_upb,
t1.ori_rate,t1.ltv,t2.month,t2.cur_upb, t2.cur_rate, t2.status 
from %I t1 inner join %I t2 on t1.id=t2.id order by t1.id , t2.month desc',table3,table1,table2);
GET DIAGNOSTICS count_ = ROW_COUNT;
return count_;
end;
$$
language plpgsql
并调用上面的函数,如下所示,该函数将返回插入的行数:

select * from insert_values('table1','table2','table3');

请解释如何计算列
payoffmonth
payoffupb
payoffrate
laststatus
?为什么01和02月份没有显示在输出中?选择03月份的一行而不是另一行的规则是什么?如果04月还有3行呢?嗨,很抱歉搞混了。我用更多的解释更新了我的问题。但我的问题主要是关于如何编写一个包含两个输入表和一个输出表的函数。我已经做了功能转换部分,这里只是一个简单的演示,但我想对其他类似的表文件应用同样的方法。您好,谢谢您的帮助!如果我有很多table1和table2,我如何编写一个函数来处理每一对table1和table2呢?你能详细说明一下你想要什么吗。所有其他表(表1、表2、表3)是否具有相同的结构和逻辑是的。其他表(表1、表2、表3)的结构和逻辑完全相同。只有表格的名称不同。@JingsiXu我已经按照您的要求编辑了答案。