根据 CASE WHEN 条件确定优先级/排名

问题描述 投票:0回答:1

我想创建一个名为“Priority”的新列,为此我必须查看多个 TABLE_ID,其中包含分配给 TABLE_ID 的 ACCOUNT_ID。可以有重复的 TABLE_ID,但 ACCOUNT_ID 是唯一的。多个 ACCOUNT_ID 可以分配给一个 TABLE_ID,这就是为什么我想对它们进行优先级排序。我遇到的问题是,我在分区时得到的数字超出了我分配为 row_number 的数字,而不是优先考虑它们。

这是我的表格示例:

表_ID 帐户_ID 帐户名称
10101010 02020202 优质
10101010 02020204 性能
0120202 0930303 性能
0120202 039303 价值
0303303 039302929 价值
0303303 0393342929

这是预期结果:

表_ID 帐户_ID 帐户名称 优先
10101010 02020202 优质 1
10101010 02020204 性能 2
0120202 0930303 性能 1
0120202 039303 价值 2
0303303 039302929 价值 1
0303303 0393342929 2

我基本上想根据 ACCOUNT_NAME 确定 ACCOUNT_ID 的优先级,其中:

PREMIUM = 1
PERFORMANCE = 2
VALUE = 3 
PLUS = 4 

但是,如果 TABLE_ID 没有带有 PREMIUM ACCOUNT_NAME 的 ACCOUNT_ID,则优先级应分配给下一个 PERFORMANCE,其应为 Priority = 1,因为当 PREMIUM 不存在时,它是第一优先级帐户。我正在尝试使用 sas 中的 proc sql 来实现此目的,并且我不断获得比情况条件中规定的优先级数字更大的优先级数字。

SELECT 
    *, 
    ROW_NUMBER() OVER (
        PARTITION BY TABLE_ID
        ORDER BY 
            CASE 
                WHEN ACCOUNT_NAME = 'PREMIUM' THEN 1 
                WHEN ACCOUNT_NAME  = 'PERFORMANCE' THEN 2
                WHEN ACCOUNT_NAME  = 'VALUE' THEN 3
                WHEN ACCOUNT_NAME  = 'PLUS' THEN 4
                ELSE 5
            END
    ) AS Priority
FROM 
   TABLE_A as a;

sql sas proc-sql
1个回答
0
投票

对数据进行排序。然后您可以对观察结果进行计数/排序/排序。

首先,让我们将您的列表转换为我们可以编程的实际数据集:

data have;
  input TABLE_ID $ ACCOUNT_ID :$10. ACCOUNT_NAME :$20.;
cards;
0120202  0930303    PERFORMANCE
0120202  039303     VALUE
0303303  039302929  VALUE
0303303  0393342929 PLUS
10101010 02020202   PREMIUM
10101010 02020204   PERFORMANCE
;

您可以在 PROC SQL 中使用 CASE 语句将 ACCOUNT_NAME 映射为数值,以便您可以使用它进行排序。 (或者您可以创建一个信息并使用 INPUT() 函数。)然后按该数值变量对数据进行排序。一旦订购,您就可以计算观察结果。

proc sql ;
create table STEP1 as 
select *
     ,case when ACCOUNT_NAME = 'PREMIUM' then 1
           when ACCOUNT_NAME = 'PERFORMANCE' then 2
           when ACCOUNT_NAME = 'VALUE' then 3
           when ACCOUNT_NAME = 'PLUS' then 4
           else 99
      end as ACCOUNT_PRIORITY
from have
order by TABLE_ID, ACCOUNT_PRIORITY, ACCOUNT_NAME
;
quit;

data want;
  set step1;
  by table_id account_priority;
  priority+1;
  if first.table_id then priority=1;
run;
© www.soinside.com 2019 - 2024. All rights reserved.