如何使用给定月份中先前已知出现条目的值填充表?

Posted

技术标签:

【中文标题】如何使用给定月份中先前已知出现条目的值填充表?【英文标题】:How to populate a table with values from the previous known occurrence entry in a given month? 【发布时间】:2020-11-24 17:43:55 【问题描述】:

我有如下 sn-p 所示的表格,其中包含以下数据。每行有两个键 "IDENTIFIER" , "NEW IDENTIFIER" 组合,用于输入月份,并适当填充其他字段。对于每个 a1 (IDENTIFIER),给定月份可能有多个 s1,s2 ( NEW IDENTIFIER )。

预期的转换表

对于 (a1,s1),(a1,s2),(a2,s4) 的每个组合,从第一个发生日期开始,新表中应该有一个对应的条目,用于 2020 年的所有缺失月份,即如果组合从 3 月开始 - 那么输出应该包含从 3 月到 12 月的条目。

除了在生成新的组合条目字段“FIRST NAME”时,应根据条目月份从原始表中的最后一个已知条目推断/复制“LAST NAME”。

在下面的示例/图片中,您可以发现对于 (a1,s1) => april 的新条目的组合,可能具有与 March 条目相同的值,而 july 条目是从原始表中先前已知的条目月份填充的,即 6 月和同样,从 8 月开始,9 月、10 月、11 月、12 月的人口都会增加。

【问题讨论】:

【参考方案1】:

交叉连接会创建所有要填充的组合,相关的子查询会找到要填充的内容:

create or replace temp table sparse
as
select '1' id1, 'a' id2, 'james' name1, 'wood' name2, '2002-01-01'::date month
union all select 1,'a','joyce','flowers', '2002-06-01'
union all select 1,'a','pat','strings', '2002-08-01'
;

with months as (
    select date_from_parts(2002, seq8()+1, 1) month
    from table(generator(rowcount => 12))
), months_ids as (
    select *
    from months
    cross join (select distinct id1, id2 from sparse)
)

select *
  , (select array_agg(name1) within group (order by month desc) from sparse where a.month>=month and a.id1=id1 and a.id2=id2)[0]::string name1
  , (select array_agg(name2) within group (order by month desc) from sparse where a.month>=month and a.id1=id1 and a.id2=id2)[0]::string name2
from months_ids a
order by month

开头:

结尾:

【讨论】:

以上是关于如何使用给定月份中先前已知出现条目的值填充表?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用python有效地填充给定一个非常大的表的矩阵?

PostgreSQL根据表字段生成月份和年份系列,如果没有给定月份的数据则填充空值

在 omp 循环中填充已知大小的矩阵。条目大小未知

如何在父表中满足相应条件的相关模型中插入条目

如何根据先前活动中的操作填充 ListView?

让函数返回表的更新部分