如果我有一个名为myTable的表:
| Var1 | Var2 | Var3 | Var4 | Var5 |
+-------+------+------+------+------+--------+
| Name1 | 1.1 | 1.2 | 0 | 03 | 201805 |
| Name1 | 1.1 | 1.2 | 0 | 03 | 201803 |
| Name2 | 2.1 | 2.2 | 0 | 03 | 202001 |
| Name3 | 3.1 | 3.2 | 3 | 01 | 202002 |
在其余变量匹配且仅匹配的情况下,我将如何编写一个查询,用Name1
中的Var1
和Var2
值覆盖/更新所有Name2
行是否在Var5
处于期望的时间间隔内(例如201805
-> 202001
)进行操作?
答案 0 :(得分:1)
在SAS Proc SQL
中,查询有点困难。
data have;
input
name $ Var1 Var2 Var3 Var4 Var5: yymmn6.;
format var5 yymmn6.;
datalines;
Name1 1.1 1.2 0 03 201805
Name1 1.1 1.2 0 03 201803
Name2 2.1 2.2 0 03 202001
Name3 3.1 3.2 3 01 202002
;
proc sql;
create table rewrites as
select two.var1, two.var2
from have as one join have as two
on one.var3 = two.var3
& one.var4 = two.var4
where one.name = 'Name1' and two.name = 'Name2'
& one.var5 between '01may2018'd and '31jan2020'd
& two.var5 between '01may2018'd and '31jan2020'd
;
update have
set
var1=(select var1 from rewrites)
, var2=(select var2 from rewrites)
where name = 'Name1'
& var5 between '01may2018'd and '31jan2020'd
;
quit;
%let syslast = have;
答案 1 :(得分:0)
看看SQL'LEAD()'函数。
有一些不错的示例here 来自此URL的示例:
SELECT
month,
brand_name,
net_sales,
LEAD(net_sales,1) OVER (
PARTITION BY brand_name
ORDER BY month
) next_month_sales
FROM
sales.vw_netsales_brands
WHERE
year = 2018;
基本上,您可以从下一行中选择值。
对于var5的条件,只需将其放在WHERE子句中即可。