Даты в столбцах вместо строк в SAS - преимущества? - PullRequest
1 голос
/ 30 сентября 2019

Мало кто из моих клиентов использует даты хранения SAS в столбцах.
Например:

| Id | Variable1_201101 | Variable1_201102 | ... | Variable1_201909 | Variable2_201101 | Variable2_201102 | ... |  

и т. Д.

Вместо хранения дат в строках:

| Id | Date | Variable1 | Variable2 |

В результате они имеют огромное количество ячеек, потому что даже если какой-то идентификатор не существует в конкретную дату, в первой структуре будет пустая ячейка, а во второй структуре строка будет опущена.

Я никогда не встречал таких структур хранения в SQL, где это не было бы идеальным решением. Есть ли преимущества таких структур в SAS?

Ответы [ 2 ]

1 голос
/ 30 сентября 2019

Идеальной структуры хранения никогда не бывает. Существуют превосходные структуры для решения проблем под рукой. Иногда вам нужно изменить форму данных для конкретного решения, иногда у процедуры есть грамматика или механизмы для изменения формы внутри самой процедуры.

Например, при проверке переменной в разных временных рамках в The TTEST Procedure может использоваться PAIRED утверждение и требуют различных переменных для значений. Таким образом, сравнение значений за январь 2011 г. со значениями за январь 2012 г. имело бы смысл иметь структуру с Variable1_201101 Variable1_201201.

. Дисковое пространство для разреженных широких данных может быть эффективно сокращено с помощью параметров COMPRESS= настоимость декомпрессии циклов процессора. В зависимости от данных использование диска может быть значительно меньше, но при альтернативном категориальном анализе с этим трудно справиться.

Традиционная СУБД имеет категорическую форму (вертикальную) в качестве очень распространенной наилучшей практики, с индексированием и иностраннымиключи. Если это исходный макет, вам может понадобиться повернуть или изменить форму данных для конкретного анализа TTEST.

При работе с данными, найденными в хранилище данных NOSQL, вы можете столкнуться с тем, что чаще будете сталкиваться с горизонтальной формой (потому что подстилающий слой)лучше справляется с разреженностью).

1 голос
/ 30 сентября 2019

Подготовьте код:

data have;
id=786;
Variable1_201101 = 78; 
Variable1_201102  =67;  
Variable1_201909 = 23; 
Variable2_201101 = 34 ;
Variable2_201102  = 12;
run;

Теперь у нас есть:

+-----+------------------+------------------+------------------+------------------+------------------+
| id  | Variable1_201101 | Variable1_201102 | Variable1_201909 | Variable2_201101 | Variable2_201102 |
+-----+------------------+------------------+------------------+------------------+------------------+
| 786 |               78 |               67 |               23 |               34 |               12 |
+-----+------------------+------------------+------------------+------------------+------------------+

Использование транспонирования с подстановочными знаками:

PROC TRANSPOSE DATA=have
    OUT=have2
    PREFIX=Column
    NAME=Source
    LABEL=Label
;
    BY id;
    VAR Variable1_: Variable2_:;

Результат:

+-----+------------------+---------+
| id  |      Source      | Column1 |
+-----+------------------+---------+
| 786 | Variable1_201101 |      78 |
| 786 | Variable1_201102 |      67 |
| 786 | Variable1_201909 |      23 |
| 786 | Variable2_201101 |      34 |
| 786 | Variable2_201102 |      12 |
+-----+------------------+---------+

Теперь мы будем "разбирать":

    data have3;
    set have2;
    format date ddmmyyp10.; 
    date_str=substr(Source,find(source,"_")+1);
    date=INputN(date_str||"01"," yymmn6.");
    variable_name=substr(Source,1,find(source,"_")-1);


/*  Optional*/
drop date_str source ;
    run;

    PROC SORT
    ;
    BY date id;
RUN;

И снова транспонировать:

    PROC TRANSPOSE DATA=have3
    OUT=want (drop=source)
    PREFIX=Column
    NAME=Source
    LABEL=Label
;
    BY date id;
    ID variable_name;
    VAR Column1;

Результат:

+------------+-----+-----------------+-----------------+
|    date    | id  | ColumnVariable1 | ColumnVariable2 |
+------------+-----+-----------------+-----------------+
| 01.01.2011 | 786 |              78 |              34 |
| 01.02.2011 | 786 |              67 |              12 |
| 01.09.2019 | 786 |              23 |               . |
+------------+-----+-----------------+-----------------+
...