Базовый SQL (компилируется в SAS) — получение первых 10 записей по частоте

Я новичок в SQL и пытаюсь запустить этот фрагмент кода, чтобы подсчитать частоту каждой записи, но получаю сообщение об ошибке (и не могу понять, почему - в этой среде нет реальной отладки, просто " ОШИБКА 22-322: Синтаксическая ошибка, ожидающая одного из следующих: ;, ',', USING. & ОШИБКА 202-322: Опция или параметр не распознаны и будут проигнорированы.").

Кстати, я компилирую в SAS Enterprise Guide 6.1. Любая помощь приветствуется!

proc sql;
create view work.temp as 
select model_name, count(*) as frequency
from mytable_name
where model_type like '%Smartphones%'
and model_name not like '%Apple iPhone 5%'
group by model_name
order by count(*) desc 
limit 10;   
quit; 

person cappuccino    schedule 03.07.2015    source источник
comment
Вы используете proc sql для этого, потому что хотите изучить его, или по какой-то другой причине?   -  person Joe    schedule 03.07.2015
comment
Я только начинаю, и все здесь его используют — все просто компилируют код SQL в SAS. Я пытаюсь научиться этому по ходу дела.   -  person cappuccino    schedule 03.07.2015
comment
Быстрая вещь, которую вы узнаете: каждый компилятор SQL отличается. Oracle, SQL Server, mySQL, SAS и т. д. имеют разные реализации, которые в основном одинаковы, но имеют существенные различия по краям.   -  person Joe    schedule 03.07.2015
comment
Кроме того, ваша версия SAS (вероятно, 9.4, если у вас EG 6.1) имеет большее значение, чем версия Enterprise Guide. EG — это просто ваша IDE, она не имеет ничего общего с тем, что на бэкэнде делает реальную работу.   -  person Joe    schedule 03.07.2015
comment
Наконец, если вы используете SAS, хотя бы немного изучите обычный SAS. Многое из того, что вы делаете выше, будет проще и быстрее с использованием встроенных процедур. PROC FREQ и PROC MEANS почти гарантированно будут быстрее, чем PROC SQL для такого рода вещей, потому что они оптимизированы для того, что они делают.   -  person Joe    schedule 03.07.2015


Ответы (2)


limit 10 недопустимый код в SAS proc sql. В общем, не существует хорошего способа ограничить наблюдения за выводом в SAS PROC SQL; (obs=10) по какой-то причине недопустим в качестве параметра набора данных.

Вы также не можете order by count(*); вы можете заказать только по созданному столбцу.

Итак, вы можете сделать это:

proc sql;
  create view work.temp as 
    select model, count(*) as frequency
      from sashelp.cars
      group by model
      order by 2  desc 
;
quit; 

2 относится ко второму столбцу (то есть к столбцу частоты).

Если вы хотите ограничиться меньшим количеством наблюдений, вы можете использовать (obs=#) там, где вы фактически используете представление, в некоторых случаях (но не в других - в общем, я не думаю, что это допустимо в PROC SQL в большинстве случаев).

В общем, этот конкретный запрос, вероятно, проще в базовом SAS, чем в SQL, особенно если вы хотите ограничить его вывод.

proc freq data=sashelp.cars order=freq noprint;
  where origin='Asia';
  tables make/out=makelist(where=(count>10) keep=make count);
run;

Это будет работать немного быстрее, чем SQL (при условии, что вы ничего не получите от представления, в любом случае; если вы выводите только несколько строк, представление вам не сильно поможет). Конечно, здесь я ограничиваюсь конкретным количеством, а не конкретным количеством наблюдений, но это почти то же самое.

Чтобы ответить на вопрос заголовка, вы можете просто выбрать 10 лучших записей из этого набора данных (при условии, что вы попросили PROC FREQ вернуть набор данных, отсортированный по частоте, как я сделал выше):

data topten;
  set makelist;
  if _n_ le 10;  *first 10 iterations;
run;

Или используйте proc rank или любое количество вариантов.

person Joe    schedule 03.07.2015

Вы можете использовать OUTOBS= параметр PROC SQL для ограничения наблюдений.

proc sql outobs= 10;
    create view work.temp as 
    select model_name, count(*) as frequency
    from mytable_name
    where model_type like '%Smartphones%'
    and model_name not like '%Apple iPhone 5%'
    group by model_name
    order by count(*) desc;   
quit; 

Если вы пытаетесь изучить SQL в SAS, используя пример кода, я бы порекомендовал пройти через эти примеры из SAS.

person Pasha    schedule 04.07.2015