Similar presentations:
Язык программирования SAS Base
1. День 2
Язык программирования SAS Base2. Документация
Вся документация по языку SAS Base доступна по ссылке:http://support.sas.com/documentation/onlinedoc/base/index.html#ba
se92
3. Преобразование данных в информацию
Основные понятия SAS Base:3
Data Set (набор данных)
Библиотека
Data step (шаг данных)
PROC (процедура)
4. Раздел 1.1
Набор данных5. Атрибуты SAS переменных
––
–
5
Все переменные SAS должны иметь три обязательных
атрибута:
имя
тип
длина.
6. Имена переменных
––
–
6
Существуют некоторые правила при наименовании SAS
наборов данных и переменных.
SAS имена
должны быть длиной от 1 до 32 символов
должны начинаться с буквы (A-Z) или нижнего подчеркивания
(_)
далее допустимы любые комбинации цифр, букв и
подчеркиваний.
7. Типы переменных в SAS
Переменные могут бытьСимвольные
(1 to 32K)
Числовые
по умолчанию, сохраняются
в 8 байтах
7
8. Формат
Формат – это инструкция, каким образом отображатьпеременные при работе.
Форматы имеют следующую общую форму:
<$>format<w>.<d>
Определяет
символьный
формат
Десятичный
разряд
Имя формата
Общая ширина
(включая десятичный
разряд и специальные
символы)
8
Требуемый
разделитель
9. Форматирование значений
Вы можете изменить отображаемое значение переменной,используя форматы данных.
SAS
Data
Set
Format
Report
Значения в исходном SAS наборе данных не
изменяются.
9
10. Форматы
Некоторые форматы SAS:w.d
8.2
стандартный числовой формат
Width=8, 2 десятичных разряда:
$w.
$5.
Стандартный символьный формат
Width=5:
KATHY
COMMAw.d
COMMA9.2
цифровой с запятой
Width=9, 2 десятичных разряда:
12234.21
12,234.21
DOLLARw.d знак доллара и запятая
DOLLAR10.2 Width=10, 2 десятичных разряда: $12,234.21
10
11. Форматы
Хранимоезначение
27134.2864
27134.2864
27134.2864
27134.2864
27134.2864
27134.2864
27134.2864
11
Формат
COMMA12.2
12.2
DOLLAR12.2
DOLLAR9.2
DOLLAR8.2
DOLLAR5.2
DOLLAR4.2
Отображаемое
значение
27,134.29
27134.29
$27,134.29
$27134.29
27134.29
27134
27E3
12. Даты в системе SAS
SAS даты имеют специальное числовое представление,которое является количеством дней между 1 января 1960 г. и
указанной датой.
1jan1959
1jan1960
1jan1961
1jan2000
DATE9. Informat
-365
0
Отрицательные
значения
366
Положительные
значения
MMDDYY10. Format
12
14610
13. Форматы
Некоторые форматы для даты:MMDDYYw.
Отображаемое
значение
MMDDYY6.
101601
MMDDYY8.
10/16/01
MMDDYY10. 10/16/2001
Формат
13
DATEw.
Отображаемое
значение
DATE7.
16OCT01
DATE9. 16OCT2001
Формат
14.
ФорматыПримеры:
Хранимое
значение
Формат
0
MMDDYY8.
0
MMDDYY10.
1
DATE9.
-1
WORDDATE.
365
DDMMYY10.
Отображаемое значение
01/01/60
01/01/1960
02JAN1960
December 31,
1959
31/12/1960
366
14
WEEKDATE. Sunday, January 1, 1961
15. Форматы
Полный список форматов:http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/defa
ult/viewer.htm#a001263753.htm
15
16. Терминологические соотношения
16Обработка данных
SAS
SQL
файл
запись
поле
набор
наблюдение
переменная
таблица
строка
столбец
17. Терминология SAS
В документации SAS и SAS программах следующиетермины используются взаимозаменяемо:
17
SAS набор
SAS таблица
Переменная
Колонка
Наблюдение
Строка
18. Получение SAS набора данных
Вводданных
Внешний
файл
Таблица
(SAS или
внешняя)
Преобразование
SAS
набор
Раздел
описаний
18
Раздел
данных
19. SAS наборы данных
SAS наборы данных включают в себя описательнуючасть и собственно данные.
Раздел
описаний
Общая информация
* Имя
* Индексы
* Время создания
* Компрессия
* Количество записей
Информация по каждой переменной
* Имя
* Тип
* Длина
* Позиция
* Формат * Информат * Ярлык
Раздел
данных
19
20. Раздел описаний
––
Раздел описаний SAS набора данных содержит
общую информацию о SAS наборе (например, имя набора
данных, количество наблюдений)
атрибуты переменных (имя, тип, длина, позиция, формат,
наименование).
Процедура CONTENTS (Data Set Attributes) используется для
отображения раздела описаний набора данных.
20
21. SAS наборы данных: раздел данных
FirstNameJobTitle
Salary
TORRES
LANGKAMM
SMITH
WAGSCHAL
TOERMOEN
JAN
SARAH
MICHAEL
NADJA
JOCHEN
Pilot
Mechanic
Mechanic
Pilot
Pilot
50000
80000
40000
77500
65000
Символьные значения
21
Числовые
значения
Значения
переменных
LastName
Имена
переменных
Раздел данных SAS набора – это таблица
символьных и/или числовых значений данных.
22. Значения переменных SAS
Существует два типа переменных:символьный содержит любое значение:
буквы, цифры, специальные символы и
пробелы. По умолчанию, длина символьного
значения от 1 до 32,767 байт. Один байт равен
одному символу.
числовой
по умолчанию, это число с
плавающей запятой длиной 8 байт.
22
23. Пустые значения
Каждая переменная для каждого наблюдения должнаиметь определенное значение. В случае отсутствия
значения или ошибки переменной принудительно
присваиваются:
LastName
FirstName
JobTitle
Salary
TORRES
LANGKAMM
SMITH
WAGSCHAL
TOERMOEN
JAN
SARAH
MICHAEL
NADJA
Pilot
Mechanic
Mechanic
Pilot
50000
80000
.
77500
65000
пробел «» для
символьной
переменной.
23
точка «.» для
числовой
переменной.
24. Раздел 1.2
Библиотеки данных SAS25. Библиотеки данных SAS
Библиотека – набор файлов, представляемый как единоецелое. Чтобы указать SAS библиотеку, необходимо
определить расположение библиотеки и присвоить ей
имя (libref).
Один файл – один набор данных (таблица)
25
26. Библиотеки данных SAS
После запуска SAS, вы автоматически получаете доступ квременной библиотеке Work.
Таблицы в этой библиотеке существуют только на время
работы сессии (приложения)
26
27. Двухуровневые имена файлов
Каждый файл SAS имеет двухуровневое имя:libref.filename
Набор данных Report.offer – это SAS файл в
библиотеке Report.
–
Первая часть имени
(libref) указывает на
библиотеку.
work
offer
27
Вторая часть имени
(filename) указывает на
файл внутри библиотеки.
MAMisc
Report
28. Назначение библиотеки
Для назначения библиотеки используется операторLIBNAME.
Синтаксис оператора LIBNAME:
LIBNAME libref 'SAS-data-library' ;
Имена библиотек:
должны быть не более 8 символов в длину
должны начинаться с буквы или подчеркивания
могут состоять из букв, цифр и подчеркиваний.
28
29. Временный файл
Имя библиотеки work может быть опущено, когда выссылаетесь на файл этой библиотеки. По умолчанию, SAS
обращается к библиотеке work, если имя библиотеки не
указано.
work.employee
29
employee
30. Раздел 1.3
Основные положения языка программирования31.
Синтаксис языка SASОбычно начинается с идентификатора (identifying
keyword).
Всегда заканчивается точкой с запятой (semicolon).
data work.staff;
infile 'raw-data-file';
input LastName $ 1-20 FirstName $ 21-30
JobTitle $ 36-43 Salary 54-59;
run;
proc print data=work.staff;
run;
31
proc means data=work.staff;
class JobTitle;
var Salary;
run;
32. Синтаксис языка SAS
Комментарии в SAS программе/* текст комментария */ заключается в
комбинацию символов /* */.
/* Create work.staff data set */
data work.staff;
infile 'raw-data-file';
input LastName $ 1-20 FirstName $ 21-30
JobTitle $ 36-43 Salary 54-59;
run;
/* Produce listing report of work.staff */
proc print data=work.staff;
run;
33
c02s3d2
33.
SAS программаSAS программа – это последовательность шагов,
направляемых пользователем на выполнение.
Исходные
данные
Шаг данных (DATA step) обычно
используется для создания набора данных.
DATA
Step
SAS
набор
данных
34
SAS
набор
данных
PROC
Step
Отчет
Процедурный шаг (PROC step)
предназначен для обработки наборов
данных (создание отчетов и графиков,
редактирование данных, сортировка и
т.д.)
34. SAS программа
Границы шагаШаги SAS программы начинаются с
оператора DATA
оператора PROC.
SAS выявляет конец шага, когда встречаются
35
оператор RUN (для большинства шагов)
оператор QUIT (для некоторых процедур)
начало другого шага (оператор DATA или
PROC).
35. Границы шага
Запуск SAS программПри запуске SAS программы информация о работе
выводится в два основных окна:
SAS log
output
36
содержит информацию о ходе выполнения
SAS программы, включая сообщения о
возникших ошибках.
окно вывода результатов выполнения
программного кода, как на шаге данных,
так и на процедурном шаге.
36. Запуск SAS программ
Синтаксические ошибкиОшибки могут быть
орфографические
ошибки пунктуации
задание неверных параметров.
daat work.staff;
infile 'raw-data-file';
input LastName $ 1-20 FirstName $ 21-30
JobTitle $ 36-43 Salary 54-59;
run;
proc print data=work.staff
run;
37
proc means data=work.staff average max;
class JobTitle;
var Salary;
run;
37. Синтаксические ошибки
Раздел 1.5Обработка данных на шаге данных
38. Раздел 1.5
SAS программыШаг данных (DATA Step) обычно используется для создания
набора данных.
Исходные
данные
DATA
Step
SAS
набор
данных
39
SAS
набор
данных
39. SAS программы
Чтение SAS набораОсновной синтаксис шага данных:
DATA output-SAS-data-set;
SET input-SAS-data-set;
additional SAS statements
RUN;
По умолчанию, оператор SET считывает
– все наблюдения из исходного набора
– все перечисленные в исходном наборе переменные.
40
40. Чтение SAS набора
Создание нескольких наборов данныхОператор DATA начинает шаг данных и задает имена для
новых наборов.
Вы можете создать несколько наборов в пределах одного
шага данных, перечислив через пробел имена создаваемых
наборов в операторе DATA.
DATA <data-set-name-1> <…data-set-name-n>;
41
41. Создание нескольких наборов данных
SAS выраженияВыражение содержит операнды и операторы,
которые формируют инструкции для вывода
значений.
Операнды – это
имена переменных
константы.
42
Операторы – это
символы, выполняющие
арифметические вычисления
SAS функции.
42. SAS выражения
Шаг данных (DATA Step)–
–
43
Шаг данных можно разделить на два этапа:
этап компиляции
этап выполнения.
43. Шаг данных (DATA Step)
Фаза компиляции–
–
–
–
–
–
44
На этапе компиляции
проверяется программный код на наличие синтаксических
ошибок
программный код преобразуется в машинный
выделяется область памяти – входной буфер, если
предполагается чтение внешнего файла
создается область памяти для Вектора данных (Program
Data Vector – PDV)
назначаются обязательные атрибуты для переменных
создается область описаний для создаваемого набора
данных.
44. Фаза компиляции
Компиляция шага данныхlibname ia 'SAS-data-library';
data onboard;
set ia.dfwlax;
Total=FirstClass+Economy;
run;
PDV
Flight Date Dest FirstClass Economy
.
45
.
.
c07s1d1
...
45. Компиляция шага данных
libname ia 'SAS-data-library';data onboard;
set ia.dfwlax;
Total=FirstClass+Economy;
run;
PDV
Flight Date Dest FirstClass Economy Total
.
46
.
.
.
c07s1d1
...
46. Компиляция шага данных
Типы переменных по умолчанию–
–
На этапе компиляции
Всем переменным присваивается тип.
Длина строковых переменных определяется:
47
По первому вхождению
Если стоит присвоение константы, длина приравнивается
длине константы
Если стоит присвоение другой переменной, длина
приравнивается длине переменной
Если форматируется из числа, длина приравнивается длине
формата
В противном случае зависит от функции
47. Типы переменных по умолчанию
Оператор LENGTHВы можете использовать оператор LENGTH для явного
задания длины переменных.
Синтаксис оператора LENGTH:
LENGTH variable(s) $ length;
Пример:
length Product_Code $ 11;
48
48. Оператор LENGTH
Фаза выполнения–
–
–
–
–
–
–
49
На этапе выполнения шага данных
инициализируется PDV
считываются данные в PDV
выполняются операторы, перечисленные на шаге данных
в конце шага данных наблюдение из PDV записывается в
выходной SAS набор данных
происходит возврат на начало шага данных
инициализируется все переменные, кроме переменных
считываемых из SAS набора
этот процесс повторяется.
49. Фаза выполнения
Шаг данныхИнициализация
PDV
Выполняется команда
“чтение”
Выполняются
операторы программы
Конец
файла?
ДА
Конец
шага
данных
НЕТ
Вывод наблюдения в
SAS набор
50
...
...
...
50. Шаг данных
Выполнение шага данныхia.dfwlax
Flight
439
921
114
Date
Dest FirstClass Economy
12/11/00 LAX
20
137
12/11/00 DFW
20
131
12/12/00 LAX
15
170
data onboard;
set ia.dfwlax;
Total=FirstClass+Economy;
run;
PDV
Flight Date
Dest FirstClass Economy Total
439
12/11/00 LAX
20
137
.
onboard
Flight Date
51
Dest FirstClass Economy Total
...
51. Выполнение шага данных
ia.dfwlaxFlight
439
921
114
Date
Dest FirstClass Economy
12/11/00 LAX
20
137
12/11/00 DFW
20
131
12/12/00 LAX
15
170
data onboard;
set ia.dfwlax;
Total=FirstClass+Economy;
run;
PDV
Flight Date
Dest FirstClass Economy Total
439
12/11/00 LAX
20
137
157
onboard
Flight Date
52
Dest FirstClass Economy Total
...
52. Выполнение шага данных
ia.dfwlaxFlight Date
Dest FirstClass Economy
439
12/11/00 LAX
20
137
921
12/11/00 DFW
20
131
Автоматический
114
12/12/00 LAX
15
170
возврат
data onboard;
set ia.dfwlax;
Total=FirstClass+Economy;
run;
PDV
Flight Date
Dest FirstClass Economy Total
439
12/11/00 LAX
20
137
157
onboard
Автоматический
вывод
Flight Date
Dest FirstClass Economy Total
439
53
12/11/00 LAX
20
137
157
...
53. Выполнение шага данных
ia.dfwlaxFlight
439
921
114
Date
Dest FirstClass Economy
12/11/00 LAX
20
137
12/11/00 DFW
20
Сброс 131
Total в
12/12/00 LAX
15
170
значение
missing
data onboard;
set ia.dfwlax;
Total=FirstClass+Economy;
run;
PDV
Flight Date
Dest FirstClass Economy Total
439
12/11/00 LAX
20
137
.
onboard
Flight Date
Dest FirstClass Economy Total
439
12/11/00 LAX
20
137
157
54
...
54. Выполнение шага данных
ia.dfwlaxFlight
439
921
114
Date
Dest FirstClass Economy
12/11/00 LAX
20
137
12/11/00 DFW
20
131
12/12/00 LAX
15
170
data onboard;
set ia.dfwlax;
Total=FirstClass+Economy;
run;
PDV
Flight Date
Dest FirstClass Economy Total
921
12/11/00 DFW
20
131
.
onboard
Flight Date
Dest FirstClass Economy Total
439
12/11/00 LAX
20
137
157
55
...
55. Выполнение шага данных
ia.dfwlaxFlight
439
921
114
Date
Dest FirstClass Economy
12/11/00 LAX
20
137
12/11/00 DFW
20
131
12/12/00 LAX
15
170
data onboard;
set ia.dfwlax;
Total=FirstClass+Economy;
run;
PDV
Flight Date
Dest FirstClass Economy Total
921
12/11/00 DFW
20
131
151
onboard
Flight Date
Dest FirstClass Economy Total
439
12/11/00 LAX
20
137
157
56
...
56. Выполнение шага данных
ia.dfwlaxFlight Date
Dest FirstClass Economy
439
12/11/00 LAX
20
137
921
12/11/00 DFW
20
131
Автоматический
114
12/12/00 LAX
15
170
возврат
data onboard;
set ia.dfwlax;
Total=FirstClass+Economy;
run;
PDV
Flight Date
Dest FirstClass Economy Total
921
12/11/00 DFW
20
131
151
Автоматический
вывод
Flight
Dest
Flight Date
Date
Dest FirstClass
FirstClass Economy
Economy Total
Total
onboard
439
439
921
57
12/11/00
12/11/00 LAX
LAX
12/11/00 DFW
20
20
20
137
137
131
157
157
151
...
57. Выполнение шага данных
Список основных выражений используемых при обработкеданных с помощью data step:
http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/defa
ult/viewer.htm#a001225397.htm
58. Выполнение шага данных
Использование функцийФункция – набор инструкций по выполнению
определенных действий с аргументами.
Возвращает вычисленное значение.
Синтаксис функции:
function-name(argument1,argument2, . . .)
Пример:
Total=sum(FirstClass,Economy);
59
59. Использование функций
SAS функции– выполняют арифметические операции
– вычисляют простейшие статистики (например: сумма,
среднее, стандартное отклонение)
– управляют SAS датами и работают с символьными
значениями
– выполняют некоторые другие задачи.
Простые статистические функции игнорируют
пустые значения.
60
60. Использование функций
Примеры функцийТип
Функция
Описание
Строковые
IFC Function
Возвращает текст на основе значения выражения
INDEX Function
Возвращает положение первого вхождения поискового выражения
LOWCASE Function
Преобразует все буквы в нижний регистр
SCAN Function
Возвращает n-тое по счету слово из текста
SUBSTR (left of =)
Function
SUBSTR (right of =)
Function
TRANWRD Function
Заменяет выбранную подстроку значением выражения
UPCASE Function
Преобразует все буквы в верхний регистр
DATEPART Function
Возвращает дату из значения дата-время
INTCK Function
Возвращает количество заданных интервалов между двумя датами
INTNX Function
Увеличивает значение даты на указанное количество интервалов
WEEKDAY Function
Возвращает день недели из даты
COALESCE Function
Возвращает первое не пустое значение из списка
Дата и время
Прочее
61
Возвращает подстроку
Заменяет все вхождения подстроки на другую подстроку
61. Примеры функций
ФункцииПолный список функций:
http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/defa
ult/viewer.htm#a000245860.htm
62. Функции
Опция RENAME=Вы можете использовать опцию RENAME=, чтобы изменить
имя переменной, как во входной таблице, так и в выходной.
Синтаксис опции RENAME=:
SAS-data-set(RENAME=(old-name-1=new-name-1
old-name-2=new-name-2
.
.
.
old-name-n=new-name-n))
63
63. Опция RENAME=
Опции набора данныхПолный список опций набора данных:
http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/defa
ult/viewer.htm#a000104210.htm
64. Опции набора данных
Выбор переменныхВы можете использовать на шаге данных оператор DROP или
KEEP, чтобы управлять выводом переменных в новый набор
данных.
Синтаксис операторов DROP и KEEP:
DROP variables;
KEEP variables;
Альтернативой операторам служат опции набора данных
KEEP= и DROP=
65
65. Выбор переменных
Условное выполнениеСинтаксис операторов IF-THEN и ELSE:
IF expression THEN statement;
ELSE statement;
Выражение содержит операнды и операторы, которые
формируют набор инструкций, создающий значение.
Операнды это
имена
переменных
константы.
66
Операторы это
символы
– сравнения
– логических операций
– арифметических вычислений
SAS функции.
66. Условное выполнение
Вы можете использовать операторы DO и END, чтобывыполнять группу операторов по условию.
Синтаксис составного оператора:
IF expression THEN DO;
executable statements
END;
ELSE DO;
executable statements
END;
67
67. Условное выполнение
Множественные условияВы можете использовать операторы SELECT и WHEN, чтобы
выполнять операторы по набору условий.
Синтаксис оператора SELECT :
SELECT (select-expression);
WHEN-n (when-expression-1 <..., whenexpression-n>) DO; executable statements END;
OTHERWISE DO; executable statements END;
END;
68
68. Множественные условия
Вы можете использовать операторы SELECT и WHEN, чтобывыполнять операторы по набору условий.
Синтаксис оператора SELECT :
SELECT;
WHEN-n (when-expression) DO; executable
statements END;
OTHERWISE DO; executable statements END;
END;
69
69. Множественные условия
Удаление строкВы можете использовать оператор DELETE, чтобы
контролировать, какие строки выводить в набор данных.
Синтаксис оператора DELETE:
IF expression THEN DELETE;
Выражение – может быть любое SAS выражение.
70
70. Удаление строк
Объединение SAS наборовИспользуйте оператор SET на шаге данных, чтобы объединить
наборы данных.
Синтаксис шага данных для простого объединения:
DATA SAS-data-set ;
SET SAS-data-set1 SAS-data-set2 . . .;
<other SAS statements>
RUN;
71
71. Объединение SAS наборов
Процедура SORTВы можете трансформировать записи в группы, применив
процедуру SORT.
Синтаксис PROC SORT:
PROC SORT DATA=input-SAS-data-set
<OUT=output-SAS-data-set>;
BY <DESCENDING> BY-variable ...;
RUN;
72
72. Процедура SORT
Процедура SORT– переупорядочивает записи в SAS наборе
– создает новый набор данных, содержащий упорядоченные
записи
– может проводить сортировку по нескольким переменным
одновременно
– может сортировать данные как в возрастающем, так и в
убывающем порядке
– считает “пустые” значения как наименьшие.
73
73. Процедура SORT
Процедуры SASДокументация по процедурам SAS:
http://support.sas.com/documentation/cdl/en/proc/61895/HTML/defa
ult/viewer.htm#titlepage.htm
74. Процедуры SAS
Оператор RETAINСинтаксис оператора RETAIN:
RETAIN variable-name <initial-value> …;
Оператор RETAIN предотвращает переинициализацию
значений переменных на каждом цикле шага данных.
Предыдущие значения удерживаемых переменных доступны
для обработки на следующих итерациях шага данных.
75
75. Оператор RETAIN
Оператор RETAIN– выполняется во время компиляции
– создает переменные, если они не объявлены ранее
– присваивает начальное значение (если задано) или
инициализирует указанные переменные
– сохраняет текущее значение переменной во время
инициализации PDV.
76
76. Оператор RETAIN
По-групповая обработкаДля организации доступа к данным по группам используется
директива BY в операторе SET:
DATA output-SAS-data-set;
SET input-SAS-data-set;
BY BY-variable … ;
<additional SAS statements>
RUN;
После группирования данных появляется возможность
– организовать работу с записями по группам
– определять первую/последнюю записи в группе.
77
77. По-групповая обработка
Директива BY создает временные переменные для каждогозначения переменной, указанной в операторе BY.
Синтаксис временных переменных:
First.BY-variable
Last.BY-variable
78
78. По-групповая обработка
First. и Last. значения–
–
79
Переменная First. принимает значение 1 при
обработке первой записи в группе, во всех остальных
случаях переменная равна 0.
Переменная Last. принимает значение 1 при обработке
последней записи в группе, во всех остальных случаях
переменная равна 0.
79. First. и Last. значения
Неявный выводПо умолчанию, каждый шаг данных содержит оператор
неявного вывода OUTPUT в конце каждой итерации.
Оператор OUTPUT сообщает системе SAS, что нужно
вывести наблюдения в результирующий набор данных.
2. Неявный
возврат
data forecast;
set prog2.growth;
<additional SAS
statements>;
run;
1. Неявный вывод
80
80. Неявный вывод
2. Неявныйвозврат
data forecast;
set prog2.growth;
<additional SAS
statements>;
run;
1. Неявный вывод
Когда одно наблюдение считывается из
prog2.growth, одно наблюдение записывается в
forecast.
81
81. Неявный вывод
Оператор OUTPUTЯвный оператор OUTPUT записывает текущее содержимое
PDV в набор данных.
Указание явного оператора OUTPUT на шаге данных
подавляет неявный вывод, и SAS добавляет наблюдение в
набор только при выполнении явного оператора OUTPUT.
OUTPUT;
82
82. Оператор OUTPUT
Задачаdata forecast;
drop NumEmps;
set prog2.growth;
Year=1;
NewTotal=NumEmps*(1+Increase);
output;
Year=2;
NewTotal=NewTotal*(1+Increase);
output;
Year=3;
NewTotal=NewTotal*(1+Increase);
output;
run;
83
83. Задача
Partial Listing of prog2.growthDivision
APTOPS
FINACE
FLTOPS
Num
Компиляция
Emps
Increase
205
198
187
0.075
0.040
0.080
data forecast;
drop NumEmps;
set prog2.growth;
Year=1;
NewTotal=NumEmps*(1+Increase);
output;
Year=2;
NewTotal=NewTotal*(1+Increase);
output;
Year=3;
NewTotal=NewTotal*(1+Increase);
output;
run;
PDV
84
84.
Partial Listing of prog2.growthDivision
APTOPS
FINACE
FLTOPS
Num
Emps
Increase
205
198
187
0.075
0.040
0.080
data forecast;
drop NumEmps;
set prog2.growth;
Year=1;
NewTotal=NumEmps*(1+Increase);
output;
Year=2;
NewTotal=NewTotal*(1+Increase);
output;
Year=3;
NewTotal=NewTotal*(1+Increase);
output;
run;
PDV
DIVISION NUMEMPS
$
N
6
8
85
INCREASE
N
8
85.
Partial Listing of prog2.growthDivision
APTOPS
FINACE
FLTOPS
Num
Emps
Increase
205
198
187
0.075
0.040
0.080
data forecast;
drop NumEmps;
set prog2.growth;
Year=1;
NewTotal=NumEmps*(1+Increase);
output;
Year=2;
NewTotal=NewTotal*(1+Increase);
output;
Year=3;
NewTotal=NewTotal*(1+Increase);
output;
run;
PDV
DIVISION NUMEMPS
$
N
6
8
86
INCREASE
N
8
YEAR
N
8
86.
Partial Listing of prog2.growthDivision
APTOPS
FINACE
FLTOPS
Num
Emps
Increase
205
198
187
0.075
0.040
0.080
data forecast;
drop NumEmps;
set prog2.growth;
Year=1;
NewTotal=NumEmps*(1+Increase);
output;
Year=2;
NewTotal=NewTotal*(1+Increase);
output;
Year=3;
NewTotal=NewTotal*(1+Increase);
output;
run;
PDV
DIVISION NUMEMPS
$
N
6
8
87
INCREASE
N
8
YEAR
N
8
NEWTOTAL
N
8
87.
Partial Listing of prog2.growthDivision
APTOPS
FINACE
FLTOPS
Num
Emps
Increase
205
198
187
0.075
0.040
0.080
data forecast;
drop NumEmps;
set prog2.growth;
Year=1;
NewTotal=NumEmps*(1+Increase);
output;
Year=2;
NewTotal=NewTotal*(1+Increase);
output;
Year=3;
NewTotal=NewTotal*(1+Increase);
output;
run;
PDV
DIVISION NUMEMPS
$
N
D
6
8
88
INCREASE
N
8
YEAR
N
8
NEWTOTAL
N
8
88.
Partial Listing of prog2.growthDivision
APTOPS
FINACE
FLTOPS
Num
Выполнение
Emps
Increase
205
198
187
0.075
0.040
0.080
Partial Listing of forecast
New
Division
Year
Total
data forecast;
drop NumEmps;
set prog2.growth;
Year=1;
NewTotal=NumEmps*(1+Increase);
output;
Year=2;
NewTotal=NewTotal*(1+Increase);
output;
Year=3;
NewTotal=NewTotal*(1+Increase);
output;
run;
PDV
DIVISION NUMEMPS
$
N
D
6
8
89
INCREASE
N
8
YEAR
N
8
NEWTOTAL
N
8
89.
Partial Listing of prog2.growthDivision
APTOPS
FINACE
FLTOPS
Num
Emps
Increase
205
198
187
0.075
0.040
0.080
Partial Listing of forecast
New
Division
Year
Total
Инициализация
PDV
DIVISION NUMEMPS
$
N
D
6
8
.
90
data forecast;
drop NumEmps;
set prog2.growth;
Year=1;
NewTotal=NumEmps*(1+Increase);
output;
Year=2;
NewTotal=NewTotal*(1+Increase);
output;
Year=3;
NewTotal=NewTotal*(1+Increase);
output;
run;
PDV
INCREASE
N
8
YEAR
N
8
NEWTOTAL
N
8
.
.
.
90.
Partial Listing of prog2.growthDivision
APTOPS
FINACE
FLTOPS
Num
Emps
Increase
205
198
187
0.075
0.040
0.080
Partial Listing of forecast
New
Division
Year
Total
data forecast;
drop NumEmps;
set prog2.growth;
Year=1;
NewTotal=NumEmps*(1+Increase);
output;
Year=2;
NewTotal=NewTotal*(1+Increase);
output;
Year=3;
NewTotal=NewTotal*(1+Increase);
output;
run;
PDV
DIVISION NUMEMPS
$
N
D
6
8
APTOPS
91
205
INCREASE
N
8
YEAR
N
8
NEWTOTAL
N
8
0.075
.
.
91.
Partial Listing of prog2.growthDivision
APTOPS
FINACE
FLTOPS
Num
Emps
Increase
205
198
187
0.075
0.040
0.080
Partial Listing of forecast
New
Division
Year
Total
data forecast;
drop NumEmps;
set prog2.growth;
Year=1;
NewTotal=NumEmps*(1+Increase);
output;
Year=2;
NewTotal=NewTotal*(1+Increase);
output;
Year=3;
NewTotal=NewTotal*(1+Increase);
output;
run;
PDV
DIVISION NUMEMPS
$
N
D
6
8
APTOPS
92
205
INCREASE
N
8
YEAR
N
8
NEWTOTAL
N
8
0.075
.
.
92.
Partial Listing of prog2.growthDivision
APTOPS
FINACE
FLTOPS
Num
Emps
Increase
205
198
187
0.075
0.040
0.080
Partial Listing of forecast
New
Division
Year
Total
data forecast;
drop NumEmps;
set prog2.growth;
Year=1;
NewTotal=NumEmps*(1+Increase);
output;
Year=2;
NewTotal=NewTotal*(1+Increase);
output;
Year=3;
NewTotal=NewTotal*(1+Increase);
output;
run;
PDV
DIVISION NUMEMPS
$
N
D
6
8
APTOPS
93
205
INCREASE
N
8
YEAR
N
8
NEWTOTAL
N
8
0.075
1
.
93.
Partial Listing of prog2.growthDivision
APTOPS
FINACE
FLTOPS
Num
Emps
Increase
205
198
187
0.075
0.040
0.080
Partial Listing of forecast
New
Division
Year
Total
data forecast;
drop NumEmps;
set prog2.growth;
Year=1;
NewTotal=NumEmps*(1+Increase);
output;
Year=2;
NewTotal=NewTotal*(1+Increase);
output;
Year=3;
NewTotal=NewTotal*(1+Increase);
output;
run;
PDV
DIVISION NUMEMPS
$
N
D
6
8
APTOPS
94
205
205*(1+0.075)
INCREASE
N
8
YEAR
N
8
NEWTOTAL
N
8
0.075
1
220.38
94.
Partial Listing of prog2.growthDivision
APTOPS
FINACE
FLTOPS
Num
Emps
Increase
205
198
187
0.075
0.040
0.080
Partial Listing of forecast
New
Division
Year
Total
APTOPS
1
220.38
data forecast;
drop NumEmps;
set prog2.growth;
Year=1;
NewTotal=NumEmps*(1+Increase);
output;
Year=2;
NewTotal=NewTotal*(1+Increase);
output;
Year=3;
NewTotal=NewTotal*(1+Increase);
output;
run;
PDV
DIVISION NUMEMPS
$
N
D
6
8
APTOPS
95
205
INCREASE
N
8
YEAR
N
8
NEWTOTAL
N
8
0.075
1
220.38
Запись первого наблюдения в forecast.
95.
Partial Listing of prog2.growthDivision
APTOPS
FINACE
FLTOPS
Num
Emps
Increase
205
198
187
0.075
0.040
0.080
Partial Listing of forecast
New
Division
Year
Total
APTOPS
1
220.38
data forecast;
drop NumEmps;
set prog2.growth;
Year=1;
NewTotal=NumEmps*(1+Increase);
output;
Year=2;
NewTotal=NewTotal*(1+Increase);
output;
Year=3;
NewTotal=NewTotal*(1+Increase);
output;
run;
PDV
DIVISION NUMEMPS
$
N
D
6
8
APTOPS
96
205
INCREASE
N
8
YEAR
N
8
NEWTOTAL
N
8
0.075
2
220.38
96.
Partial Listing of prog2.growthDivision
APTOPS
FINACE
FLTOPS
Num
Emps
Increase
205
198
187
0.075
0.040
0.080
Partial Listing of forecast
New
Division
Year
Total
APTOPS
1
220.38
data forecast;
drop NumEmps;
set prog2.growth;
Year=1;
NewTotal=NumEmps*(1+Increase);
output;
Year=2;
NewTotal=NewTotal*(1+Increase);
output;
Year=3;
NewTotal=NewTotal*(1+Increase);
output;
run;
PDV
DIVISION NUMEMPS
$
N
D
6
8
APTOPS
97
205
220.38*(1+0.075)
INCREASE
N
8
YEAR
N
8
NEWTOTAL
N
8
0.075
2
236.90
97.
Partial Listing of prog2.growthDivision
APTOPS
FINACE
FLTOPS
Num
Emps
Increase
205
198
187
0.075
0.040
0.080
Partial Listing of forecast
New
Division
Year
Total
APTOPS
APTOPS
1
2
220.38
236.90
data forecast;
drop NumEmps;
set prog2.growth;
Year=1;
NewTotal=NumEmps*(1+Increase);
output;
Year=2;
NewTotal=NewTotal*(1+Increase);
output;
Year=3;
NewTotal=NewTotal*(1+Increase);
output;
run;
PDV
DIVISION NUMEMPS
$
N
D
6
8
APTOPS
98
205
INCREASE
N
8
YEAR
N
8
NEWTOTAL
N
8
0.075
2
236.90
Запись второго наблюдения в forecast.
98.
Partial Listing of prog2.growthDivision
APTOPS
FINACE
FLTOPS
Num
Emps
Increase
205
198
187
0.075
0.040
0.080
Partial Listing of forecast
New
Division
Year
Total
APTOPS
APTOPS
1
2
220.38
236.90
data forecast;
drop NumEmps;
set prog2.growth;
Year=1;
NewTotal=NumEmps*(1+Increase);
output;
Year=2;
NewTotal=NewTotal*(1+Increase);
output;
Year=3;
NewTotal=NewTotal*(1+Increase);
output;
run;
PDV
DIVISION NUMEMPS
$
N
D
6
8
APTOPS
99
205
INCREASE
N
8
YEAR
N
8
NEWTOTAL
N
8
0.075
3
236.90
99.
Partial Listing of prog2.growthDivision
APTOPS
FINACE
FLTOPS
Num
Emps
Increase
205
198
187
0.075
0.040
0.080
Partial Listing of forecast
New
Division
Year
Total
APTOPS
APTOPS
1
2
220.38
236.90
data forecast;
drop NumEmps;
set prog2.growth;
Year=1;
NewTotal=NumEmps*(1+Increase);
output;
Year=2;
NewTotal=NewTotal*(1+Increase);
output;
Year=3;
NewTotal=NewTotal*(1+Increase);
output;
run;
PDV
DIVISION NUMEMPS
$
N
D
6
8
APTOPS
10
205
236.90*(1+0.075)
236.90*(1+0.075)
INCREASE
N
8
YEAR
N
8
NEWTOTAL
N
8
0.075
3
254.67
100.
Partial Listing of prog2.growthDivision
APTOPS
FINACE
FLTOPS
Num
Emps
Increase
205
198
187
0.075
0.040
0.080
Partial Listing of forecast
New
Division
Year
Total
APTOPS
APTOPS
APTOPS
1
2
3
220.38
236.90
254.67
data forecast;
drop NumEmps;
set prog2.growth;
Year=1;
NewTotal=NumEmps*(1+Increase);
output;
Year=2;
NewTotal=NewTotal*(1+Increase);
output;
Year=3;
NewTotal=NewTotal*(1+Increase);
output;
run;
PDV
DIVISION NUMEMPS
$
N
D
6
8
APTOPS
10
205
INCREASE
N
8
YEAR
N
8
NEWTOTAL
N
8
0.075
3
254.67
Запись третьего наблюдения в forecast.
101.
Partial Listing of prog2.growthDivision
APTOPS
FINACE
FLTOPS
Num
Emps
Increase
205
198
187
0.075
0.040
0.080
Partial Listing of forecast
New
Division
Year
Total
APTOPS
APTOPS
APTOPS
1
2
3
220.38
236.90
254.67
data forecast;
drop NumEmps;
set prog2.growth;
Year=1;
NewTotal=NumEmps*(1+Increase);
output;
Year=2;
NewTotal=NewTotal*(1+Increase);
output;
Year=3;
NewTotal=NewTotal*(1+Increase);
output;
run;
Явный
вывод
PDV
DIVISION NUMEMPS
$
N
D
6
8
APTOPS
10
205
INCREASE
N
8
YEAR
N
8
NEWTOTAL
N
8
0.075
3
254.67
102.
Partial Listing of prog2.growthDivision
APTOPS
FINACE
FLTOPS
Num
Emps
Increase
205
198
187
0.075
0.040
0.080
возврат
PartialНеявный
Listing of forecast
Division
APTOPS
APTOPS
APTOPS
Year
1
2
3
New
Total
220.38
236.90
254.67
data forecast;
drop NumEmps;
set prog2.growth;
Year=1;
NewTotal=NumEmps*(1+Increase);
output;
Year=2;
NewTotal=NewTotal*(1+Increase);
output;
Year=3;
NewTotal=NewTotal*(1+Increase);
output;
run;
Явный
вывод
PDV
DIVISION NUMEMPS
$
N
D
6
8
APTOPS
10
205
INCREASE
N
8
YEAR
N
8
NEWTOTAL
N
8
0.075
3
254.67
103.
Оператор OUTPUTПо умолчанию, явный оператор OUTPUT запишет текущее
наблюдение в каждый SAS набор, указанный в операторе
DATA.
Вы можете задать имя набора или нескольких наборов,
чтобы указать, куда выводить наблюдение.
OUTPUT <SAS-data-set-1 …SAS-data-set-n>;
10
104. Оператор OUTPUT
Слияние наборов данныхЧтобы объединить соответствующие записи из двух или более
наборов данных, используйте оператор MERGE на шаге
данных.
Общая форма команды слияния на шаге данных:
DATA SAS-data-set;
MERGE SAS-data-sets;
BY BY-variable(s);
<other SAS statements>
RUN;
10
105. Слияние наборов данных
ЗадачаРассчитать разницу между фактическим и плановым
доходом, таблицы performance и goals необходимо
объединить.
ia.performance
Month
1
2
Sales
2118223
1960034
ia.goals
Month
1
2
Goal
2130000
1920000
Слияние данных по переменной
Month и вычисление разницы
между значениями переменных
Sales и Goal.
ia.compare
Month
1
2
106
Sales
2118223
1960034
Goal Difference
2130000
-11777
1920000
40034
106. Задача
Слияние данных: компиляцияia.performance
Month
1
2
3
Sales
2118223
1960034
2094220
ia.goals
Month
1
2
3
Goal
2130000
1920000
2130000
data ia.compare;
merge ia.performance ia.goals;
by Month;
Difference=Sales-Goal;
run;
PDV
107
Month
N
8
107. Слияние данных: компиляция
ia.performanceMonth
1
2
3
Sales
2118223
1960034
2094220
ia.goals
Month
1
2
3
Goal
2130000
1920000
2130000
data ia.compare;
merge ia.performance ia.goals;
by Month;
Difference=Sales-Goal;
run;
PDV
108
Month
N
8
Sales
N
8
108. Слияние данных: компиляция
ia.performanceMonth
1
2
3
Sales
2118223
1960034
2094220
ia.goals
Month
1
2
3
Goal
2130000
1920000
2130000
data ia.compare;
merge ia.performance ia.goals;
by Month;
Difference=Sales-Goal;
run;
PDV
109
Month
N
8
Sales
N
8
109. Слияние данных: компиляция
ia.performanceMonth
1
2
3
ia.goals
Month
1
2
3
Sales
2118223
1960034
2094220
Goal
2130000
1920000
2130000
data ia.compare;
merge ia.performance ia.goals;
by Month;
Difference=Sales-Goal;
run;
PDV
110
Month
N
8
Sales
N
8
Goal
N
8
110. Слияние данных: компиляция
ia.performanceMonth
1
2
3
ia.goals
Month
1
2
3
Sales
2118223
1960034
2094220
Goal
2130000
1920000
2130000
data ia.compare;
merge ia.performance ia.goals;
by Month;
Difference=Sales-Goal;
run;
PDV
111
Month
N
8
Sales
N
8
Goal
N
8
Difference
N
8
111. Слияние данных: компиляция
ia.performanceMonth
1
2
3
ia.goals
Month
1
2
3
Sales
2118223
1960034
2094220
Goal
2130000
1920000
2130000
data ia.compare;
merge ia.performance ia.goals;
by Month;
Difference=Sales-Goal;
run;
PDV
ia.
compare
112
Month
N
8
Month
N
8
Sales
N
8
Sales
N
8
Goal
N
8
Goal
N
8
Difference
N
8
Создан
Difference раздел
N
описаний
8
112. Слияние данных: компиляция
Слияние данных: выполнениеia.
performance
Month
1
2
3
Sales
2118223
1960034
2094220
Month
1
2
3
Goal
2130000
1920000
2130000
ia.
goals
data ia.compare;
merge ia.performance ia.goals;
by Month;
Difference=Sales-Goal;
run;
PDV
Month
.
Sales
.
Goal Difference
.
.
Инициализация PDV в missing
113
113. Слияние данных: выполнение
ia.performance
Month
1
2
3
Sales
2118223
1960034
2094220
Month
1
2
3
Goal
2130000
1920000
2130000
ia.
goals
Есть совпадение по BY переменной?
Yes
data ia.compare;
merge ia.performance ia.goals;
by Month;
Difference=Sales-Goal;
run;
PDV
114
Month
.
1
Sales
Goal Difference
. 2130000
.
.
2118223
114. Слияние данных: выполнение
ia.performance
Month
1
2
3
Sales
2118223
1960034
2094220
Month
1
2
3
Goal
2130000
1920000
2130000
ia.
goals
data ia.compare;
merge ia.performance ia.goals;
by Month;
Difference=Sales-Goal;
run;
PDV
115
Month
1
Sales
Goal Difference
2118223 2130000
-11777
115. Слияние данных: выполнение
ia.performance
Month
1
2
3
Sales
2118223
1960034
2094220
Month
1
2
3
Goal
2130000
1920000
2130000
ia.
goals
data ia.compare;
merge ia.performance ia.goals;
Автоматический
by Month;
возврат
Difference=Sales-Goal;
run;
PDV
Month
1
Sales
Goal Difference
2118223 2130000
-11777
Автоматический вывод
ia.
Month
compare
1
116
Sales
Goal Difference
2118223 2130000
-11777
116. Слияние данных: выполнение
ia.performance
Month
1
2
3
Sales
2118223
1960034
2094220
Month
1
2
3
Goal
2130000
1920000
2130000
ia.
goals
Есть совпадение по BY переменной?
Yes
data ia.compare;
merge ia.performance ia.goals;
by Month;
Difference=Sales-Goal;
run;
Изменилась BY переменная?
PDV
117
Yes
Month
1
Sales
Goal Difference
2118223 2130000
-11777
117. Слияние данных: выполнение
ia.performance
Сброс
PDV
в missing.
PDV
Month
1
2
3
Month
1
2
3
Goal
2130000
1920000
2130000
ia.
goals
data ia.compare;
merge ia.performance ia.goals;
by Month;
Difference=Sales-Goal;
run;
Month
.
ia.
Month
compare
1
118
Sales
2118223
1960034
2094220
Sales
.
Goal Difference
.
.
Sales
Goal Difference
2118223 2130000
-11777
118. Слияние данных: выполнение
ia.performance
Month
1
2
3
Sales
2118223
1960034
2094220
Month
1
2
3
Goal
2130000
1920000
2130000
ia.
goals
data ia.compare;
merge ia.performance ia.goals;
by Month;
Difference=Sales-Goal;
run;
Month
2
Sales
Goal Difference
1960034 1920000
.
ia.
Month
compare
1
Sales
Goal Difference
2118223 2130000
-11777
PDV
119
119. Слияние данных: выполнение
ia.performance
Month
1
2
3
Sales
2118223
1960034
2094220
Month
1
2
3
Goal
2130000
1920000
2130000
ia.
goals
data ia.compare;
merge ia.performance ia.goals;
by Month;
Difference=Sales-Goal;
run;
Month
2
Sales
Goal Difference
1960034 1920000
40034
ia.
Month
compare
1
Sales
Goal Difference
2118223 2130000
-11777
PDV
120
120. Слияние данных: выполнение
ia.performance
Month
1
2
3
Sales
2118223
1960034
2094220
Month
1
2
3
Goal
2130000
1920000
2130000
ia.
goals
data ia.compare;
Автоматический
merge ia.performance ia.goals;
возврат
by Month;
Difference=Sales-Goal;
run;
PDV
Month
2
Sales
Goal Difference
1960034 1920000
40034
Автоматический вывод
ia.
Month
Sales
Goal
Month
Sales
Goal Difference
Difference
compare
11 2118223
-11777
2118223 2130000
2130000
-11777
2
121
1960034 1920000
40034
121. Слияние данных: выполнение
ia.performance
Month
1
2
3
Sales
2118223
1960034
2094220
Month
1
2
3
Goal
2130000
1920000
2130000
ia.
goals
Есть совпадение по BY переменной?
Yes
data ia.compare;
merge ia.performance ia.goals;
by Month;
Difference=Sales-Goal;
run;
Изменилась BY переменная?
PDV
122
Yes
Month
2
Sales
Goal Difference
1960034 1920000
40034
122. Слияние данных: выполнение
ia.performance
Сброс
PDV
в missing.
PDV
Month
1
2
3
Month
1
2
3
Goal
2130000
1920000
2130000
ia.
goals
data ia.compare;
merge ia.performance ia.goals;
by Month;
Difference=Sales-Goal;
run;
Month
.
ia.
Month
compare
1
2
123
Sales
2118223
1960034
2094220
Sales
.
Goal Difference
.
.
Sales
Goal Difference
2118223 2130000
-11777
1960034 1920000
40034
123. Слияние данных: выполнение
ia.performance
Month
1
2
3
Sales
2118223
1960034
2094220
Month
1
2
3
Goal
2130000
1920000
2130000
ia.
goals
data ia.compare;
merge ia.performance ia.goals;
by Month;
Difference=Sales-Goal;
run;
Month
3
Sales
Goal Difference
2094220 2130000
.
ia.
Month
compare
1
Sales
Goal Difference
2118223 2130000
-11777
1960034 1920000
40034
PDV
2
124
124. Слияние данных: выполнение
ia.performance
Month
1
2
3
Sales
2118223
1960034
2094220
Month
1
2
3
Goal
2130000
1920000
2130000
ia.
goals
data ia.compare;
merge ia.performance ia.goals;
by Month;
Difference=Sales-Goal;
run;
Month
3
Sales
Goal Difference
2094220 2130000
-35780
ia.
Month
compare
1
Sales
Goal Difference
2118223 2130000
-11777
1960034 1920000
40034
PDV
2
125
125. Слияние данных: выполнение
ia.performance
Автоматический
возврат
PDV
Month
1
2
3
Sales
2118223
1960034
2094220
Month
1
2
3
Goal
2130000
1920000
2130000
ia.
goals
data ia.compare;
merge ia.performance ia.goals;
by Month;
Difference=Sales-Goal;
run;
Month
3
Sales
Goal Difference
2094220 2130000
-35780
Автоматический вывод
Month
Month
Sales
Sales
Goal
Goal Difference
Difference
ia.
11 2118223
2118223 2130000
2130000
-11777
-11777
compare
22
3
126
1960034
1960034 1920000
1920000
2094220 2130000
40034
40034
-35780
126. Слияние данных: выполнение
ia.performance
Конец
файла
Month
1
2
3
Sales
2118223
1960034
2094220
Month
1
2
3
Goal
2130000
1920000
2130000
ia.
goals
data ia.compare;
merge ia.performance ia.goals;
by Month;
Difference=Sales-Goal;
run;
Month
3
Sales
Goal Difference
2094220 2130000
-35780
Month
ia.
1
compare
Sales
Goal Difference
2118223 2130000
-11777
1960034 1920000
40034
2094220 2130000
-35780
PDV
2
3
127
Конец
файла
127. Слияние данных: выполнение
Опция IN=Используйте опцию IN=, чтобы определить, запись из
какого набора обрабатывается в данный момент.
Общая форма записи опции IN=:
SAS-data-set(IN=variable)
Variable – это временная числовая переменная,
принимающая два значения:
0 набор данных не связан с текущей записью;
1 обрабатываемое наблюдение принадлежит
набору.
128
128. Опция IN=
Индексы SASЛюбая таблица SAS может иметь индекс.
Индекс может быть простым (по одной переменной) или
составным (по нескольким переменным)
Общая форма записи опции индекса:
SAS-data-set(INDEX=(index-spec-1 ...<index-spec-n>)
index= (variable(s) </UNIQUE> </NOMISS>)
Имя простого индекса всегда совпадает с переменной
Имя композитного индекса может быть любым
129
129. Индексы SAS
Индекс используется– При объединениях с помощью merge (исключает
необходимость сортировки)
– При объединениях с помощью Proc SQL
– При использовании опции KEY= в SET
130
130. Индексы SAS
Доступ к данным по ключуДля доступа к данным по значению ключа
используется специальная опция KEY=
DATA output-SAS-data-set;
SET input-SAS-data-set1;
SET input-SAS-data-set2
KEY=INDEX</UNIQUE>;
<additional SAS statements>
RUN;
131
131. Доступ к данным по ключу
На наборе данных, к которому осуществляется доступ сопцией KEY= должен существовать индекс с указанным
именем
Поиск осуществляется по значениям переменных
составляющих индекс на момент выполнения выражения
В случае обнаружения соответствующей записи,
автоматическая переменная _IORC_ = 0
В противном случае _IORC_ имеет отличное от нуля
значения, _ERROR_ = 1
132
132. Доступ к данным по ключу
Загрузка таблицы в памятьДля существенного ускорения доступа к данным
возможно предварительно загрузить таблицу (и
индекс) целиком в память, сократив количество
операций ввода\вывода
SASFILE SAS-data-set LOAD;
SASFILE SAS-data-set CLOSE;
133
133. Загрузка таблицы в память
Суммарный размер всех загруженных таблиц не долженпревышать доступный лимит памяти для сессии SAS
После окончания работы таблицы нужно выгружать из
памяти для освобождения места
134
134. Загрузка таблицы в память
Полная документация:http://support.sas.com/documentation/cdl/en/lrdict/64316/HTM
L/default/viewer.htm#a001500739.htm
135
135. Загрузка таблицы в память
Использование хэш-таблицДля существенного ускорения доступа к данным во
время выполнения шага данных возможно создать
хэш-таблицу
declare hash name (dataset:' SAS-data-set ');
name.defineKey(‘Key-column-1‘<, ‘Key-column-n‘>);
name.defineData((‘Data-column-1‘<, ‘Data-column-n‘>);
name.defineDone();
Для подстановки значения используется функция find
rc = name.find();
136
136. Использование хэш-таблиц
На наборе данных, к которому осуществляется доступчерез хэш игнорируются все индексы
Поиск осуществляется по значениям переменных
заданных с помощью функции DefinKey на момент
выполнения выражения
В случае обнаружения соответствующей записи, функция
find возвращает 0
В противном случае функция find возвращает отличное от
нуля значение, _ERROR_ = 1
137
137. Использование хэш-таблиц
Полная документация:http://support.sas.com/documentation/cdl/en/lrdict/64316/HTM
L/default/viewer.htm#a002576871.htm
138
138. Использование хэш-таблиц
Раздел 1.6Обработка данных с помощью SQL
139. Раздел 1.6
Синтаксис PROC SQLОбщая форма записи процедуры SQL:
PROC SQL <noprint>;
SELECT column-1<, column-2>...
FROM table-1|view-1<, table-2|view-2>...
<WHERE expression>
<GROUP BY column-1<, column-2>…>
<HAVING expression>
<ORDER BY column-1<, column-2>… <DESC>>;
QUIT;
14
140. Синтаксис PROC SQL
PROC SQLПозволяет выполнять SQL запросы
Поддерживает основные выражения ANSI SQL
Позволяет единообразно обращаться как к данным SAS,
так и данным в реляционных СУБД
141
141. PROC SQL
День 3Оптимизация работы с Oracle. Логирование
142. День 3
Раздел 2.1Работа с Oracle
143. Раздел 2.1
Опции подключения к OracleПри подключении к Oracle полезно использовать следующие
опции для ускорения обмена информацией
Опция
Описание
READBUFF
Определяет размер буфера при чтении в записях. Чем больше число, тем реже
происходит запись на диск.
Определяет количество записей при вставке внутри одной транзакии
INSERTBUFF
UPDATEBUFF
DBCOMMIT
Определяет количество записей при обновлении внутри одной транзакии
Задает количество записей после которых происходит commit в БД при update,
delete, insert выражениях. Имеет высший приоритет, чем предыдущие две
опции
Полный список опций:
http://support.sas.com/documentation/cdl/en/acreldb/63647/HTML/d
efault/viewer.htm#a003113594.htm
144. Опции подключения к Oracle
Работа с текстом в OracleПо умолчанию SAS может читать и записывать текстовые
данные длиной до 1024 байт
Для изменения максимальной длины используется опция
DBMAX_TEXT=
В случае, если длина превышает 4000 байт используется тип
CLOB
Документация по опции:
http://support.sas.com/documentation/cdl/en/acreldb/63647/HTML/d
efault/viewer.htm#a001342300.htm
145. Работа с текстом в Oracle
BULK загрузка в OracleДля ускорения загрузки больших объемов в данных в БД Oracle
необходимо использовать режим BULKLOAD
В данном режиме из таблицы формируется текстовый файл в
формате, подходящим для обработки утилитой Oracle
SQLLoader
Режим доступен в шаге данных и SQL выражениях CREATE
TABLE\INSERT
Для активации режима необходимо задать, как минимум опции
BULKLOAD=YES BL_SQLLDR_PATH=“path_to_sqlldr”
Полный список опций:
http://support.sas.com/documentation/cdl/en/acreldb/63647/HTML/d
efault/viewer.htm#a001234400.htm
146. BULK загрузка в Oracle
Оптимизация вычисленийС целью оптимизации скорости выполнения запросов, SAS
старается передать объединения таблиц и вычисления в БД
Oracle
147. Оптимизация вычислений
Объединение таблиц в OracleДля того, чтобы объединение таблиц произошло в Oracle
должны выполняться следующие условия
– Объединяемые таблицы находятся в одной БД
– В случае если таблицы находятся в разных схемах,
следующие параметры libname выражения должны
совпадать: user, password, path
Более детальные условия передачи можно прочитать по
ссылке:
http://support.sas.com/documentation/cdl/en/acreldb/63647/HTML/d
efault/viewer.htm#a003113613.htm
148. Объединение таблиц в Oracle
Передача функций в OracleПри работе с Oracle SAS передает часть функций для
выполнения в БД. Для того, чтобы расширить список
передаваемых функций необходимо использовать опцию
SQL_FUNCTIONS=ALL
Полный список передаваемых функций:
http://support.sas.com/documentation/cdl/en/acreldb/63647/HTML/d
efault/a003113612.htm
149. Передача функций в Oracle
Использование Explicit Path-ThroughДля выполнения специфических SQL выражений в Oracle, таких
как PL\SQL код и аналитических функций, используется
специальный режим PROC SQL
Общий вид синтаксиса для передачи запросов в режиме Explicit
Path-Through
PROC SQL <noprint>;
CONNECT TO ORACLE AS alias (connectoptions);
EXECUTE ( SQL statements ) BY alias;
SELECT * FROM CONECTION TO alias ( SQL
statements );
DISCONNECT FROM alias;
QUIT;
150. Использование Explicit Path-Through
При использовании SQL выражений, необходимо задавать ихпо одному в одном выражении EXECUTE без «;» на конце
PROC SQL <noprint>;
CONNECT TO ORACLE AS alias (connectoptions);
EXECUTE ( SELECT rownum FROM dual ) BY
alias;
EXECUTE ( SELECT rank() over (partition by
offer_id) FROM ODB.offers ) BY alias;
DISCONNECT FROM alias;
QUIT;
151. Использование Explicit Path-Through
При использовании PL\SQL выражений код аналогиченвводимому через другие интерфейсы
PROC SQL <noprint>;
CONNECT TO ORACLE AS alias (connectoptions);
EXECUTE ( declare i number(38) := 0; ) BY alias;
DISCONNECT FROM alias;
QUIT;
152. Использование Explicit Path-Through
Документация:http://support.sas.com/documentation/cdl/en/acreldb/63647/HTML/d
efault/viewer.htm#a003113595.htm
153. Использование Explicit Path-Through
Раздел 2.2Опции SAS. Логирование
154. Раздел 2.2
Опции сессии SASДля задания разнообразных настроек сессии SAS используется
выражение OPTIONS
OPTIONS option(s);
Полный список опций доступен по ссылке:
http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/defa
ult/a002237888.htm
Для просмотра активных опций используется функция
PROC OPTIONS OPTION=option_name proc-options; RUN;
155
155. Опции сессии SAS
Опции логированияДля вывода полной информации о выполнении кампании
необходимо задать следующие опции
OPTIONS mprint mlogic symbolgen notes stimer source;
Для вывода в лог запросов передаваемых в БД Oracle
OPTIONS sastarce=‘,,,d’ sastraceloc=saslog;
156