我想创建一个名为“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;
对数据进行排序。然后您可以对观察结果进行计数/排序/排序。
首先,让我们将您的列表转换为我们可以编程的实际数据集:
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;