【问题标题】:SAS or Postgresql:add column value according to another column valueSAS或Postgresql:根据另一列值添加列值
【发布时间】:2018-08-10 08:40:20
【问题描述】:

我想添加一个“索引”列,当“变量”列中的行具有相同的值时,“索引”列的值相同。您可以使用 Postgresql 或 SAS 语法。

有一件事是“变量”列中的值每天都在变化,比如tableA和tableB,所以硬编码是不可接受的。任何建议都值得赞赏!

+----------+--------------+------+-------+-----+-----+-------+
| variable | new_variable | type | start | end | woe | index |
+----------+--------------+------+-------+-----+-----+-------+
| A        | mi_A         | char | 1     |     | 1.3 |     1 |
| A        | mi_A         | char | 0     |     | 0.6 |     1 |
| B        | mi_B         | char | 1     |     | 5.4 |     2 |
| B        | mi_B         | char | 0     |     | 0.1 |     2 |
| gnd_cd   | gnd_cd       | char | 3     |     | 1.3 |     3 |
| gnd_cd   | gnd_cd       | char | @0    |     | 0.6 |     3 |
| gnd_cd   | gnd_cd       | char | 2     |     | 5.4 |     3 |
| gnd_cd   | gnd_cd       | char | N     |     | 0.1 |     3 |
| gnd_cd   | gnd_cd       | char | 1     |     | 1.3 |     3 |
| gnd_cd   | gnd_cd       | char | 99    |     | 0.6 |     3 |
| mar_sign | mar_sign     | char | 0     |     | 5.4 |     4 |
| mar_sign | mar_sign     | char | Y     |     | 0.1 |     4 |
| mar_sign | mar_sign     | char | N     |     |   6 |     4 |
| C        | C            | char | 6     |     |   2 |     5 |
| C        | C            | char | 7     |     | 2.1 |     5 |
| C        | C            | char | 8     |     | 2.2 |     5 |
+----------+--------------+------+-------+-----+-----+-------+
                         (tableA)

+--------------+--------------+------+-------+-----+-----+-------+
|   variable   | new_variable | type | start | end | woe | index |
+--------------+--------------+------+-------+-----+-----+-------+
| D            | mi_D         | char | 1     |     |   1 |     1 |
| D            | mi_D         | char | 0     |     |   2 |     1 |
| E            | mi_E         | char | 1     |     |   2 |     2 |
| E            | mi_E         | char | 0     |     |   3 |     2 |
| education_bg | education_bg | char | 3     |     |   1 |     3 |
| education_bg | education_bg | char | @0    |     |   5 |     3 |
| education_bg | education_bg | char | 2     |     |   6 |     3 |
| education_bg | education_bg | char | N     |     |   4 |     3 |
| education_bg | education_bg | char | 1     |     |   3 |     3 |
| education_bg | education_bg | char | 99    |     |   3 |     3 |
| sex          | sex          | char | 0     |     |   2 |     4 |
| sex          | sex          | char | Y     |     |   1 |     4 |
| sex          | sex          | char | N     |     |   0 |     4 |
| C            | C            | char | 6     |     |   6 |     5 |
| C            | C            | char | 7     |     |   4 |     5 |
| C            | C            | char | 8     |     |   1 |     5 |
+--------------+--------------+------+-------+-----+-----+-------+
                             (tableB)

【问题讨论】:

    标签: sql postgresql sas


    【解决方案1】:

    您可以在 SAS 中使用保留功能和按变量分组在单个数据步中执行此操作。

    代码:

    data have;
    infile datalines dlm='|';
    input variable $ new_variable $ type $ start $  end $ woe ;
    datalines;
    | A        | mi_A         | char | 1     |     | 1.3 
    | A        | mi_A         | char | 0     |     | 0.6 
    | B        | mi_B         | char | 1     |     | 5.4 
    | B        | mi_B         | char | 0     |     | 0.1 
    | gnd_cd   | gnd_cd       | char | 3     |     | 1.3 
    | gnd_cd   | gnd_cd       | char | @0    |     | 0.6 
    | gnd_cd   | gnd_cd       | char | 2     |     | 5.4 
    | gnd_cd   | gnd_cd       | char | N     |     | 0.1 
    | gnd_cd   | gnd_cd       | char | 1     |     | 1.3 
    | gnd_cd   | gnd_cd       | char | 99    |     | 0.6 
    | mar_sign | mar_sign     | char | 0     |     | 5.4 
    | mar_sign | mar_sign     | char | Y     |     | 0.1 
    | mar_sign | mar_sign     | char | N     |     |   6 
    | C        | C            | char | 6     |     |   2 
    | C        | C            | char | 7     |     | 2.1 
    | C        | C            | char | 8     |     | 2.2  
    run;
    
    data want;
    set have ;
    by variable notsorted;
    retain index;
    if first.variable then index+1;
    run;
    

    注意:我创建了索引,并且只使用新的组值增加它的值。

    【讨论】:

      【解决方案2】:

      您可以创建一个类似于以下内容的新表:

          select distinct variable, montonic() as newindex from mydata order by index;
      

      然后将它加入到原来的表中。事实上,您可以一步完成所有操作:

          select a.variable, a.new_variable, a.type, a.start, a.end, a.woe, b.newindex as index from mydata as a left join (select distinct variable, montonic() as newindex from my table order by index) as b on  a.variable=b.variable;
      

      或者类似的东西。我不能说我 100% 理解您想要实现的目标,但也许这会有所帮助。

      请注意,SAS 中的 monotonic() 函数仍然(我相信)没有记录。这意味着 SAS 可能会或可能不会继续包含它。它有效,但也许他们认为它是实验性的。

      【讨论】:

        【解决方案3】:

        考虑使用 Postgres 的 dense_rank 窗口函数进行无间隙排名:

        SELECT *, DENSE_RANK() OVER (ORDER BY variable) as "index"
        FROM mytable
        

        Rextester demo (带有随机种子数据)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-03-23
          • 1970-01-01
          • 2019-04-12
          • 2014-09-17
          • 2022-12-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多