假设我有一个表格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
答案 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;
但是,如果数据已经排序,那么为此目的使用数据步骤可能更有效。