pro c sql поведение внутреннего соединения и требуемые операторы select - PullRequest
0 голосов
/ 17 января 2020

Я недавно начал использовать SAS, получая только базовое c обучение, которое не охватывало про c sql. Я хотел бы прочитать немного больше о SAS sql, когда у меня будет время. На данный момент я нашел решение для того, что я хотел сделать, но у меня возникают трудности с пониманием происходящего.

Моя проблема началась, когда я хотел выяснить, какие предметы в моем наборе данных имеют определенное значение для все их записи. Я использовал свой ранее написанный фрагмент кода, который, как мне показалось, я понял. Я только что попытался добавить еще пару переменных и сгруппировать по операторам:

data have;
    input subject:$1. myvar:1. mycount:1.;
    datalines;
    a 1 1
    a 0 2
    a 0 3
    b 1 1
    b 0 2
    b 1 3
    c 1 1
    c 1 2 /*This subject has myvar = 1 for all its observations*/
    ;
run;

*find subjects;
proc sql;
    create table want as 
/*  select*/
/*  distinct x.subject */
/*  from */
    (select distinct subject, count(myvar) as myvar_c 
    from have where myvar = 1 group by subject) x,
    (select distinct subject, max(mycount) as max_c
    from have group by subject) y
    where x.subject = y.subject and x.myvar_c = y.max_c;
quit;

При удалении закомментированного слова «выбрать отдельный элемент x.subject from» в операторе создания таблицы приведенный выше код работает следующим образом.

Однако ранее я также создал еще один фрагмент кода, чтобы выбрать все объекты в моем наборе данных, которые имеют два типа записей:

data have2;
    input subject:$1. mytype:1.;
    datalines;
    a 1
    a 0
    a 0
    b 1
    b 0
    b 1
    c 1
    c 1 /*This subject doesn't have two types of records in all its observations*/
    ;
run;

*Find subjects;
proc sql;
   create table want2 as select
   distinct x.subject from
      have2 x, 
      (select distinct subject, count(distinct mytype) as mytype_c from have2 group by subject) y
   where y.mytype_c = 2 and x.subject = y.subject;
quit;

Что аналогично, но не требует дополнительного выберите заявление. Первый код имеет 3 оператора выбора, второй код требует только двух операторов выбора. Может кто-нибудь сообщить мне, почему это именно так? Или связать мне хорошую документацию, в которой перечислены спецификации этих типов объединений - может ли кто-нибудь также сообщить мне конкретное c имя этого типа объединений, где вы используете только запятую?

пока я пишу, также посмотрите, что могло бы использовать мой код, который я изначально написал, чтобы найти темы, которые имеют только один тип записи, и настроить ее для моей текущей проблемы>. <, Но все же хотел бы знать что происходит в первом примере. </p>

1 Ответ

0 голосов
/ 17 января 2020

Конструкция соединения SQL

FROM ONE, TWO, THREE, …

известна как CROSS JOIN и является объединением без критериев. Синтаксис запятой (,) сегодня менее распространен, и рекомендуется следующая конструкция

FROM ONE
CROSS JOIN TWO
CROSS JOIN THREE

Результирующий набор представляет собой декартово произведение , а число строк является произведением числа строк в таблицах с перекрестными связями.

Когда у запроса есть критерии (предложение WHERE), соединение является INNER JOIN.

Документация SAS для Proc SQL является хорошей отправной точкой и включает примеры .

Компонент объединенной таблицы
Объединяет таблицу с собой или с другими таблицами или представлениями.

Таблица Содержание
Синтаксис
Обязательные аргументы
Необязательный аргумент
Подробности
Типы объединений
Объединение таблиц
Ограничение таблицы
Указание строк, которые должны быть возвращены
Псевдонимы таблиц
Объединение таблиц с самим собой
Внутренние объединения
Внешние объединения
Перекрестные соединения
Объединение соединений
Естественные объединения
Объединение более двух таблиц
Сравнение объединений и подзапросов

* 104 5 * Общий совет:

Если вы хотите пошутить (поиграться) с SQL запросами в браузере, попробуйте посетить веб-сайт SQL Fiddle .

...