Удаление строк дубликатов в SAS


Тема довольно простая и задача, я думаю, распространенная, но поскольку мне в моей работе с ней пришлось столкнуться совсем недавно, то не обошлось без кривого кода и дальнейшего радостного нахождения необходимой функции. Поэтому для наглядности расскажу все по порядку.

Вначале мной был опробован метод основанных на тех знаниях которые у меня были, а именно использовались магические First.переменная и Last.переменная . Что это?
Если вы отсортируете вашу базу по какой-либо переменной , например, Name, то получите, скажем, такой  результат:


Name
1
Андрей  
2
Андрей  
3
Вася   
4
Коля   
5
Яна    
6
Яна    
7
Яна    
8
Яна    

Так вот, поскольку SAS обрабатывает данные построчно, то находясь на первой строке он будет знать что Андрей под номером 1 это начало группы Андреев и для первого Андрея будет выполнятся условие  Fist.Name=1, для последнего Андрея (2 строка), замыкающего группу будет верно Last.Name=1.


Name
Для проверки переменной Name
1
Андрей  
Fist=1
2
Андрей  
Last=1
3
Вася   
Fist=1    Last=1
4
Коля   
Fist=1    Last=1
5
Яна    
Fist=1
6
Яна    

7
Яна    

8
Яна    
Last=1

Т.к. Вася у нас в списке один то он является как началом, так и концом группы т.е. обрабатывая строчку с Васей  SAS будет считать что для него верны оба выражения Fist.Name=1 и Last.Name=1.
Ян у нас много, для Ян в 6 и 7 строке оба условия

if  Fist.Name=1 и 
if  Last.Name=1 

ложные т.к. они не начинают и не замыкают отсортированные группы. 

Если попытаться подытожить, то после сортировки вы с помощью условий Fist.переменная=1 и Last. переменная =1 можете понять - где начинается и где кончается отсортированная группа. К слову если вы будете сортировать по нескольким переменным картина будет примерна такая:


Name
Age
Для проверки переменной Name
Для проверки переменной Age
1
Андрей  
12
Fist=1
Fist=1    Last=1
2
Андрей  
13
Last=1
Fist=1    Last=1
3
Вася   
11
Fist=1    Last=1
Fist=1    Last=1
4
Коля   
15
Fist=1    Last=1
Fist=1    Last=1
5
Яна    
14
Fist=1
Fist=1
6
Яна    
14


7
Яна    
14

Last=1
8
Яна    
67
Last=1
Fist=1    Last=1

Ну вот на идеи заключающейся в том, что нам надо оставить только те записи, которые являются началом очередной группы ( при сортировке по двум переменным началом группы по второй переменной) и был основан «гениальный» метод  удаления дубликатов. Этот метод еще допустим, если надо решить проблему дубликатов по одной или двум переменным, но как только встает вопрос о всех переменных, тут уж простите «хана», надо сперва отсортировать по всем переменным а потом прописать кучу условий и становится понятно что кто-то чего то не знает. Т.к. не могли создатели языка не подумать о столь простой и нужной вещи. Она и нашлась спустя пары минут поиска:

PROC SORT  in= ФАЙЛ out=ФАЙЛ NODUNKEY;
BY _ALL_; *в этом случае дубликаты ищутся по всем переменным, можно прописать по каким именно вам надо;
Run;

Отрабатывае этот код, естественно, в разы быстрее чем все придуманные мной до этого извращения.
Заметка будет полезна скорее начинающим чем людям долго работающим с SAS