Pro sql:根据数据年份有条件地创建视图

问题描述 投票:0回答:2

我有一个问题,我无法在Stackoverflow或其他地方找到解决方案,并且不确定是否可以通过SAS proc sql解决。

我的目标是基于数据集(a)和视图(b)生成视图(z)。问题在于,(a)可以在年初更新为实际年份,而(b)只能在该年后期更新。不过,我希望我的观点(z)在年初开始生成数据(即使是临时的),这自然也只有在(a)和(b)都有可用数据的情况下才有可能。所以我想要的是视图(z)使用(b)中的最新可用年份,并将其用作实际年份(因此基本上是将数据(b)中的数据推算为(a)中的最新数据年份。我尝试使用以下代码执行此操作,但是它并不能完全按照我想要的方式工作:

proc sql;
create view x1 as 
   select ste.jahr, ste.gnr, ste.einwg, stk.stkabs
      from           d18.fg_gji_steinh as ste
                           inner join 
                        d18.fg_gji_skraft as stk
                                    on 
                        case when exists (select stkabs from d18.fg_gji_skraft where ste.jahr=stk.jahr)
                        then ste.jahr=stk.jahr and ste.gnr=stk.gnr
                        else input(ste.jahr,4.)=input(stk.jahr,4.)+1 and ste.gnr=stk.gnr
                        end 
                        order by ste.jahr, ste.gnr ;   
quit;

它会在第一年和最后一年生成预期数据,但不会在这几年之间生成数据,因为它会为一个观测结果生成两行。第一个观测值包含实际年份的数据,另一个观测值包含去年的数据。

有人知道如何解决此问题吗?

view sas case-when proc-sql
2个回答
0
投票
select a.jahr , a.gnr , a.einwg , coalesce(b.stkabs,c.stkabs) as stkabs from d18.fg_gji_steinh a left join d18.fg_gji_skraft b on a.gnr=b.gnr and a.jahr=b.jahr left join d18.fg_gji_skraft c on a.gnr=c.gnr and a.jahr=(c.jahr + 1)

0
投票
以下是我们正在寻找的视图的输入和输出数据(通过数据步骤模拟:]

/* Input data to view: tables fg_gji_steinh and fg_gji_skraft. Data in fg_gji_skraft is missing in the last two years. This has to be filled by the view with the last known data, in this example from year 2019. Table fg_gji_steinh has to be joined with table fg_gji_skraft. */ data work.fg_gji_steinh; jahr=2018; gnr=1001; einwg=1.5; output; jahr=2018; gnr=1002; einwg=1.8; output; jahr=2018; gnr=1003; einwg=2.0; output; jahr=2019; gnr=1001; einwg=1.6; output; jahr=2019; gnr=1002; einwg=1.8; output; jahr=2019; gnr=1003; einwg=2.0; output; jahr=2020; gnr=1002; einwg=1.8; output; jahr=2020; gnr=1010; einwg=1.9; output; jahr=2021; gnr=1011; einwg=2.1; output; run; data work.fg_gji_skraft; jahr=2018; gnr=1001; stkabs=10; output; jahr=2018; gnr=1002; stkabs=20; output; jahr=2018; gnr=1003; stkabs=30; output; jahr=2019; gnr=1001; stkabs=10; output; jahr=2019; gnr=1002; stkabs=22; output; jahr=2019; gnr=1003; stkabs=35; output; jahr=2020; gnr=1002; stkabs=.; output; jahr=2020; gnr=1010; stkabs=.; output; jahr=2021; gnr=1011; stkabs=.; output; run; /* Municipal mergers. This is my attempt to model the different territorial levels. Maybe there exists a smarter method to do this? With a format? We assume that in 2018 there exist three municipalities: 1001, 1002, 1003. The same in 2019. At begin of year 2020 municipalities 1001 and 1003 merge to 1010. At begin of year 2021 municipalities 1002 and 1010 merge to 1010. */ data cgdgdf; gjahr=2018; gnr=1001; fgnr=1001; output; gjahr=2018; gnr=1002; fgnr=1002; output; gjahr=2018; gnr=1003; fgnr=1003; output; gjahr=2019; gnr=1001; fgnr=1001; output; gjahr=2019; gnr=1002; fgnr=1002; output; gjahr=2019; gnr=1003; fgnr=1003; output; gjahr=2020; gnr=1001; fgnr=1010; output; gjahr=2020; gnr=1002; fgnr=1002; output; gjahr=2020; gnr=1003; fgnr=1010; output; gjahr=2020; gnr=1010; fgnr=1010; output; gjahr=2021; gnr=1001; fgnr=1011; output; gjahr=2021; gnr=1002; fgnr=1011; output; gjahr=2021; gnr=1003; fgnr=1011; output; gjahr=2021; gnr=1010; fgnr=1011; output; gjahr=2021; gnr=1011; fgnr=1011; output; run; /* Expected output data from view (here simulated with a data step)*/ data work.fg_gji_steinh_new; jahr=2018; gnr=1001; einwg=1.5; stkabs=10; output; jahr=2018; gnr=1002; einwg=1.8; stkabs=20; output; jahr=2018; gnr=1003; einwg=2.0; stkabs=30; output; jahr=2019; gnr=1001; einwg=1.6; stkabs=10; output; jahr=2019; gnr=1002; einwg=1.8; stkabs=22; output; jahr=2019; gnr=1003; einwg=2.0; stkabs=35; output; jahr=2020; gnr=1002; einwg=1.8; stkabs=22; output; jahr=2020; gnr=1010; einwg=1.9; stkabs=45; output; /*10+35*/ jahr=2021; gnr=1011; einwg=2.1; stkabs=67; output; /*10+22+35*/ run;

© www.soinside.com 2019 - 2024. All rights reserved.