2015-07-14 1 views
-1

J'essaie de définir deux indicateurs dans un ensemble de données, un pour les nouveaux clients et un pour les clients existants.Base SAS: INTNX pour identifier les clients nouveaux et existants

nouveaux clients = ont un original_purchase_date le mois précédent

Les clients existants = ont un original_purchase_date avant le mois précédent

Et je veux tirer dans toutes les activités pour les 18 derniers mois à compter du jour dernière le mois précédent où le dernier jour du mois précédent est

%let end='30Jun15'd;run; 

C'est ce que j'ai jusqu'à présent et je sais que ce code est incorrect.

proc sql; 
create table Cust as 
select 
*, 
case when original_purchase_date between intnx('MONTH', &end, -1) and intnx('MONTH', &end) then 1 else 0 end as new, 
case when original_purchase_date lt intnx('MONTH', &end, -1) then 1 
else 0 end as Existing 
from orders 
where original_purchase_date between intnx('MONTH', &end, -1) and intnx('MONTH', &end, -1) -18; 
quit; 
+1

% let end = '30juin2015'd; (pas 'run', et mieux écrire yyyy pendant des années) – realtemper

+0

Qu'est-ce que ce code fait/ne fait pas que vous savez est incorrect? – Joe

+0

Dans SAS, les expressions booléennes ont un résultat numérique égal à 1 si l'expression est vraie et 0 si elle est fausse. Vous pouvez donc écrire 'original_purchase_date entre intnx ('MONTH', & fin, -1) et intnx ('MOIS ', & fin) comme nouveau', sans clause 'case' –

Répondre

1

vos erreurs Correction, je viens à

select 
    *, 
    original_purchase_date between intnx('MONTH', &end, 0) and &end as new, 
    original_purchase_date lt intnx('MONTH', &end, 0) as Existing 
from orders 
where original_purchase_date between intnx('MONTH', &end, -18) and &end; 

intnx('MONTH', &end, 0) est le début du mois que vous avez spécifié dans le %let end = ..., intnx('MONTH', &end, -18) est le début du 18e mois devant elle.

Vous pouvez réellement faire mieux avec

select 
    *, 
    original_purchase_date between intnx('MONTH', Date(), -1, 'B') and intnx('MONTH', Date(), -1, 'E') as new, 
    original_purchase_date lt intnx('MONTH', Date(), -1, 'B') as Existing 
from orders 
where original_purchase_date between intnx('MONTH', Date(), -19, 'B') and intnx('MONTH', Date(), -1, 'E'); 

ici Date() est la date d'aujourd'hui (une date dans le mois suivant & fin) et le quatrième paramètre de intnx indique si vous voulez au début ou à la fin de le mois.