День 2
Документация
Преобразование данных в информацию
Раздел 1.1
Атрибуты SAS переменных
Имена переменных
Типы переменных в SAS
Формат
Форматирование значений
Форматы
Форматы
Даты в системе SAS
Форматы
Форматы
Терминологические соотношения
Терминология SAS
Получение SAS набора данных
SAS наборы данных
Раздел описаний
SAS наборы данных: раздел данных
Значения переменных SAS
Пустые значения
Раздел 1.2
Библиотеки данных SAS
Библиотеки данных SAS
Двухуровневые имена файлов
Назначение библиотеки
Временный файл
Раздел 1.3
Синтаксис языка SAS
SAS программа
Границы шага
Запуск SAS программ
Синтаксические ошибки
Раздел 1.5
SAS программы
Чтение SAS набора
Создание нескольких наборов данных
SAS выражения
Шаг данных (DATA Step)
Фаза компиляции
Компиляция шага данных
Компиляция шага данных
Типы переменных по умолчанию
Оператор LENGTH
Фаза выполнения
Шаг данных
Выполнение шага данных
Выполнение шага данных
Выполнение шага данных
Выполнение шага данных
Выполнение шага данных
Выполнение шага данных
Выполнение шага данных
Выполнение шага данных
Использование функций
Использование функций
Примеры функций
Функции
Опция RENAME=
Опции набора данных
Выбор переменных
Условное выполнение
Условное выполнение
Множественные условия
Множественные условия
Удаление строк
Объединение SAS наборов
Процедура SORT
Процедура SORT
Процедуры SAS
Оператор RETAIN
Оператор RETAIN
По-групповая обработка
По-групповая обработка
First. и Last. значения
Неявный вывод
Неявный вывод
Оператор OUTPUT
Задача
Оператор OUTPUT
Слияние наборов данных
Задача
Слияние данных: компиляция
Слияние данных: компиляция
Слияние данных: компиляция
Слияние данных: компиляция
Слияние данных: компиляция
Слияние данных: компиляция
Слияние данных: выполнение
Слияние данных: выполнение
Слияние данных: выполнение
Слияние данных: выполнение
Слияние данных: выполнение
Слияние данных: выполнение
Слияние данных: выполнение
Слияние данных: выполнение
Слияние данных: выполнение
Слияние данных: выполнение
Слияние данных: выполнение
Слияние данных: выполнение
Слияние данных: выполнение
Слияние данных: выполнение
Слияние данных: выполнение
Опция IN=
Индексы SAS
Индексы SAS
Доступ к данным по ключу
Доступ к данным по ключу
Загрузка таблицы в память
Загрузка таблицы в память
Загрузка таблицы в память
Использование хэш-таблиц
Использование хэш-таблиц
Использование хэш-таблиц
Раздел 1.6
Синтаксис PROC SQL
PROC SQL
День 3
Раздел 2.1
Опции подключения к Oracle
Работа с текстом в Oracle
BULK загрузка в Oracle
Оптимизация вычислений
Объединение таблиц в Oracle
Передача функций в Oracle
Использование Explicit Path-Through
Использование Explicit Path-Through
Использование Explicit Path-Through
Использование Explicit Path-Through
Раздел 2.2
Опции сессии SAS
1.32M
Категория: ПрограммированиеПрограммирование

Язык программирования SAS Base

1. День 2

Язык программирования SAS Base

2. Документация

Вся документация по языку 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 наборы данных: раздел данных

FirstName
JobTitle
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

Библиотеки данных SAS

25. Библиотеки данных 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.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
157
onboard
Flight Date
52
Dest FirstClass Economy Total
...

52. Выполнение шага данных

ia.dfwlax
Flight 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.dfwlax
Flight
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.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
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.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
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.dfwlax
Flight 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.growth
Division
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.growth
Division
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.growth
Division
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.growth
Division
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.growth
Division
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.growth
Division
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.growth
Division
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.growth
Division
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.growth
Division
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.growth
Division
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.growth
Division
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.growth
Division
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.growth
Division
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.growth
Division
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.growth
Division
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.growth
Division
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.growth
Division
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.growth
Division
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.growth
Division
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.growth
Division
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.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
108
Month
N
8
Sales
N
8

108. Слияние данных: компиляция

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
109
Month
N
8
Sales
N
8

109. Слияние данных: компиляция

ia.performance
Month
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.performance
Month
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.performance
Month
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
English     Русский Правила