Поиск минимальной / самой старой даты создания для каждого подписчика в двух разных форматах SAS - PullRequest
0 голосов
/ 13 июля 2020

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

Мой идеальный результат будет выглядеть следующим образом (где min_date / min_month - переменные, которые я пытаюсь создать):

ID подписчика | Дата создания | Мин_дата | Мин_месяц

123456 | 01Jan2020 | 01Jan2020 | Янв2020 123456 | 05Mar2020 | 01Jan2020 | Янв2020

У меня также были проблемы с форматом вывода. Когда я получил вывод, я получаю даты, отформатированные в виде какого-то последовательного кода numeri c? Например, я получу что-то вроде «22095» вместо какой-либо фактической даты.

Код, который я использую для получения минимальной даты:


create table  min_dates as 

select 
sub_id,
min2.min_date2


from (select 'Subscriber ID'n as sub_id, min('Create Date'n) as  min_date2 from work.min) as min2

inner join work.min as min1 on min1.'Subscriber ID'n = min2.sub_id;



quit;

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

  • Та же минимальная дата, разбитая на новый столбец с указанием только месяца и года
  • min_date правильно отформатирован в читаемая дата (мне не нужен какой-либо конкретный формат даты, если это на самом деле дата)

Но если это неверно и просто дает мне дату в той же строке, Мне тоже нужно это исправить.

Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 14 июля 2020

Если вы хотите использовать SQL, вам нужно будет указать SAS, какой формат использовать для отображения вычисляемых переменных. Для агрегирования по группам используется предложение GROUP BY.

select Subscriber_Id, min(Create_Date) as min_date2 format=date9.
  from have
  group by Subscriber_Id
;

Если вместо этого вы используете PRO C SUMMARY, то вычисляемая переменная будет иметь тот же формат, что и исходная переменная. Вы можете группировать с помощью оператора CLASS или, если данные сортируются с помощью оператора BY.

proc summary nway data=have ;
  class Subscriber_Id;
  var Create_Date ; 
  output out=want min=min_date2 ;
run;

Чтобы получить точную таблицу с несколькими наблюдениями для каждой группы, вы можете использовать способность PRO C SQL для автоматического добавления сводной статистики к подробным наблюдениям.

select Subscriber_Id
     , Create_Date
     , min(Create_Date) as min_date format=date9.
     , min(Create_Date) as min_month format=monyy7.
  from have
  group by Subscriber_Id
;
0 голосов
/ 14 июля 2020

Значения даты SAS - это просто числа со специальным значением (количество дней с момента 01jan1960).

Примените формат к выбранной переменной, и она будет отображаться как дата, удобочитаемая человеком.

select 
  sub_id,
  min2.min_date2 format=DATE9.
from
  ...

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

...