如何替换/覆盖值

时间:2020-11-09 13:48:15

标签: sql sas

如果我有一个名为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中的Var1Var2值覆盖/更新所有Name2行是否在Var5处于期望的时间间隔内(例如201805-> 202001)进行操作?

2 个答案:

答案 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子句中即可。