0

假设我有一个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
4

2 回答 2

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

这需要以一种有用的方式对数据集进行排序——它不必按 d 排序,但它必须将一个值的所有 d 放在一起(即,不是3 3 1 3 4 1 2 33 3 3 3 4 1 1 2很好)。

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

于 2013-08-30T14:07:09.330 回答
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;

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

于 2013-08-30T11:43:41.910 回答