2015-04-23 73 views
1

我在SAS一表,其中是例如CUSTOMER_ID 5列,他每月状态中的最频繁的值。客户有6种不同的状态。 例如返回列

customer_id month1 month2 month3 month4 month5 
12345678  Waiting Inactive Active Active Canceled 

我想返回从MONTH1列的值 - month5这是最常见的。在这种情况下,它是“活动”值。 所以结果将是

customer_id frequent 
12345678  Active  

SAS中是否有任何功能?我有一些想法如何使用SQL做到这一点,但它会很复杂,有很多的情况下,条件等。我在SAS是新的,所以我想会有一些更好的解决方案。

+1

SQL:Unpivot月,按customer_id和month分组,按customer_id分区,按count desc排序等。 – Arvo

回答

2

如果您使用数组来分割数据集为一个观察一个客户历史,你可以在PROC SQL中使用汇总函数的每月轻松获得最频繁的发生,使用最近一个月(假设是每月5 )打破关系。

data want1; 
    set have; 
    array m(*) month1 -- month5; 
    do i = 1 to dim(m); 
     cid = customer_id; 
     frequent = m(i); 
     position = i; 
     output; 
    end; 
    keep cid frequent position; 
run; 

proc sql; 
    create table want2 as select 
    cid as customer_id, 
    frequent, 
    max(position) as max_pos, 
    count(frequent) as count 
    from want1 
    group by cid, frequent; 
quit; 

proc sort data = want2; by customer_id descending count descending max_pos; run; 

data want3; 
    set want2; 
    by customer_id descending count descending max_pos; 
    if first.customer_id; 
    drop max_pos count; 
run; 
+0

非常感谢!它效果很好。 – Vendula

0

解决方案稍差,但它确实为两种不同价值观的工作,在这种情况下5个月。如果主动> = 3号,这是最常见的值:

select customer_id, case when (case when month1 = 'Active' then 1 else 0 end + 
           case when month2 = 'Active' then 1 else 0 end + 
           case when month3 = 'Active' then 1 else 0 end + 
           case when month4 = 'Active' then 1 else 0 end + 
           case when month5 = 'Active' then 1 else 0 end) >= 3 
          then 'Active' else 'Waiting' end 
from tablename 

的另一种方式,UNION ALL

select customer_id, month, count(*) as cnt 
(
    select customer_id, month1 as month from tablename 
    UNION ALL 
    select customer_id, month2 from tablename 
    UNION ALL 
    select customer_id, month3 from tablename 
    UNION ALL 
    select customer_id, month4 from tablename 
    UNION ALL 
    select customer_id, month5 from tablename 
) 
group by customer_id, month 
order by cnt 
fetch first 1 row only 

哪里FETCH FIRST是ANSI SQL,可能是某些DBMS产品TOPLIMIT

+0

谢谢。我有类似的想法。但问题是,可以有6个不同的价值观...... – Vendula

+0

也许你可以更新您的样本数据?如果是平局,你期望什么结果? – jarlh

+0

对不起,你怎么看领带? – Vendula