Попытка Select Distinct в инструкции Proc Sql для определенного столбца

Я хочу использовать select distinct в операторе proc sql для определенного столбца. У меня около 10 столбцов, и я не хочу проверять дублирование всех 10 столбцов, я просто хочу проверить дублирование одного столбца.

Поэтому, когда я пишу proc sql, как показано ниже, select distinct проверяет дублирование во всех 10 столбцах:

proc sql;
     create table newtable as
        select distinct Col1, Col2, Col3, Col4, ... , Col10 from oldtable;
quit;

Я попытался написать что-то вроде ниже, чтобы проверить дублирование только для Col3 и добавить другие столбцы в новую таблицу. Но это не удалось. Я также пробовал разные комбинации, такие как добавление нового select distinct Col3 после from oldtable, но все комбинации не сработали. Так в чем же хитрость?

proc sql;
     create table newtable as
        select (distinct Col3), * from oldtable;
quit;

person user3714330    schedule 04.09.2015    source источник


Ответы (1)


select distinct работает иначе: он может выбирать только отдельные значения из всего предложения возврата.

Неясно, что вы подразумеваете под «проверить дублирование». Предполагая, что SAS находит дубликат в одной из строк вашего конкретного столбца, какую строку он должен выбрать?

Самый простой способ сделать это, если вам все равно, какая строка возвращается, — использовать proc sort nodupkey. SQL на самом деле не очень хорошо справляется с этим, особенно версия ANSI 1999, которую использует SAS; вы можете group by использовать основную переменную и использовать max или min или подобное для всех других переменных, но это не обязательно даст вам одну реальную строку.

Если вам нужна одна реальная строка, union имеет в ней автоматическую дедупликацию; так что вы можете использовать его так. Выбор where 0 означает, что ничего не выбрано, но позволяет нам использовать union.

data class_Extra;
  set sashelp.class;
  output;
  if _n_=5 then output;
run;

proc sql;
  create table class_nodup as
    select * from class_extra where 0
    union
    select * from class_extra;
quit;

Но лучшее решение: исправить исходную проблему, создавшую дубликат.

person Joe    schedule 04.09.2015
comment
Проблема в том, что я получил дублирование из предыдущего процесса левого соединения, что означает, что входная таблица была примерно 1000 строк, а выходная таблица была примерно 1100 строк. Я ожидал, что выходная таблица также будет состоять из 1000 строк, но очевидно, что некоторые строки сохраняются два раза после левого соединения (поэтому я называю это дублированием). Я просто хотел удалить повторяющиеся строки на следующем шаге в зависимости только от одного столбца. - person user3714330; 04.09.2015
comment
Похоже, вам нужно исправить левый процесс соединения. - person Joe; 04.09.2015
comment
и я попытался реализовать select distinct на предыдущем шаге в процессе левого соединения, но это не сработало. Но я проверю group by, если это поможет мне в процессе LEft Join - person user3714330; 04.09.2015
comment
Скорее всего, у вас есть дублирование данных в правой части левого соединения. Исправьте это. - person Joe; 04.09.2015
comment
Я хочу сохранить размер (номера строк) таблицы Table_a, поэтому я думаю, что таблица Table_a должна быть справа от соединения, верно? Нравится Table_b left join Table_a - person user3714330; 04.09.2015
comment
Если у table_a есть дубликаты, вы все равно получите дополнительные строки. Иначе как SQL узнает, какой из дубликатов вам нужен? - person Joe; 04.09.2015