如何在SAS中选择​​最后一组

时间:2013-08-30 11:33:55

标签: sql select sas

假设我有一个表格Tbl,按3列{a,b,c}排序我还有另外100列,其中一列是d。如何标记last row by a group such that d=something,标志应为新列。希望这对于重新排序整个表格是可行的

a b c ...many columns... d IDX
1                        5 1                        
1                        3 2
1                        3 3
2                        3 4 
2                        3 5
2                        2 6
2                        2 7

在此表格中,我们要添加另一列newCol来标记last row by group a where d = 3

a b c ...many columns... d IDX newCol
1                        5 1   0                     
1                        3 2   0
1                        3 3   1
2                        3 4   0
2                        3 5   1
2                        2 6   0
2                        2 7   0

2 个答案:

答案 0 :(得分:1)

data want;
set have;
by a d notsorted;
if last.d and d=3 then flag=1;
run;

这要求数据集以有用的方式排序 - 它不必按顺序排列,但它必须将一个值的所有数据组合在一起(即,不是3 3 1 3 4 1 2 3但是3 3 3 3 4 1 1 2很好。)

如果情况并非如此,那么就没有一种解决方案不依赖于某种方式的排序,无论是SQL(它对数据进行排序,它只是不告诉你它正在这样做), PROC SORT或哈希表(如果你可以将所有内容都放入内存中,那么它可能是最快的排序)。

答案 1 :(得分:0)

我不确定这是如何实现的,但以下是您想要的工作:

proc sql;
    select a, b, c, . . .
    from t
    group by a, b
    having c = max(c);

请注意,此语法非常特定于SAS proc sql。它不是ANSI标准,不适用于大多数其他数据库。

这使用了一个名为“重新合并”的过程。我不确定它是否采用原始表格。

编辑:

标记线条同样简单:

proc sql;
    select a, b, c, (case when c = max(c) then 'Y' else 'N' end) as flag, . . .
    from t
    group by a, b;

但是,如果数据已经排序,那么为此目的使用数据步骤可能更有效。