我在 SAS Enterprise Guide 中有如下表。
資料型別及含義:
- ID - 數字 - 客戶 ID
- DT - 日期 - 更改日期
- OFFER_1 - 字符 - 當前報價
- OFFER_2 - 字符 - 更改后的報價
原始資料集中的值沒有排序,但如果對解決方案很重要,可以排序。
ID | DT | OFFER_1 | OFFER_2
-----|-----------|----------|----------
123 | 01MAY2020 | PR | PR
123 | 05MAY2020 | PR | P
123 | 10MAY2020 | P | P
123 | 11MAY2020 | P | P
123 | 20MAY2020 | P | PR
123 | 21MAY2020 | PR | M
123 | 25MAY2020 | M | M
777 | 30MAY2020 | PR | M
223 | 02JAN2020 | PR | PR
223 | 15MAR2020 | PR | PR
402 | 20MAR2020 | M | M
33 | 11AUG2020 | M | PR
11 | 20JAN2020 | PR | M
11 | 05FEB2020 | M | M
我需要創建新列“COL1”,其中將包含資訊:
- 如果客戶將提議從 PR 更改為 P 或 M,則計算他在再次回傳 PR 之前最多持續了多少天,或者如果他沒有回傳 PR,則在更改后他已經在 P 或 M 的天數
- 如果他沒有將 PR 更改為 P 或 M "COL1" = 0
因此,我需要如下所示的內容:
ID | DT | OFFER_1 | OFFER_2 | COL1
-----|-----------|----------|----------|---------
123 | 01MAY2020 | PR | PR | 15
123 | 05MAY2020 | PR | P | 15
123 | 10MAY2020 | P | P | 15
123 | 11MAY2020 | P | P | 15
123 | 20MAY2020 | P | PR | 15
123 | 21MAY2020 | PR | M | 15
123 | 25MAY2020 | M | M | 15
777 | 30MAY2020 | PR | M | 1
223 | 02JAN2020 | PR | PR | 0
223 | 15MAR2020 | PR | PR | 0
402 | 20MAR2020 | M | M | 0
33 | 11AUG2020 | M | PR | 0
11 | 20JAN2020 | PR | M | 16
11 | 05FEB2020 | M | M | 16
因為:
- ID = 123,在“COL1”中有 15 - 因為將 PR 更改為 P 或 M 并持續了最多 15 天(從 2020 年 5 月 5 日到 2020 年 5 月 20 日),然后再次回傳 PR,將 PR 更改為 P 或 M 2 次,但第二次變化持續了 4 天和 15 > 4
- ID = 777,在“COL1”中有 1 - 因為將 PR 更改為 P 或 M 并且最多持續 1 天(2020 年 5 月 30 日)
- ID = 223,在“COL1”中有 0 - 因為他沒有將 PR 更改為 P 或 M
- ID = 402,在“COL1”中有 0 - 因為他沒有將 PR 更改為 P 或 M
- ID = 33,在“COL1”中有 0 - 因為他沒有將 PR 更改為 P 或 M
- ID = 11,在“COL1”中有 16 個 - 因為將 PR 更改為 P 或 M,并且持續了最多 16 天(從 2020 年 1 月 20 日到 2020 年 2 月 5 日)并且沒有再次回傳 PR
@Stu Sztukowski - 以下來自我的真實資料的示例,其中您的代碼不起作用。我還添加了它應該如何:)
代碼運行錯誤的示例:
| ID | DT | OFFER_1 | OFFER_2 | COL1 |
|---|---|---|---|---|
| 1020 | 01SEP2020 | 磷 | 磷 | 1 -> 01SEP2020 和 02SEP2020 之間的天數,但從 PR 到 P 或 M 沒有變化,所以這個客戶對我們不感興趣,它應該是 0 |
| 1020 | 02SEP2020 | 磷 | 磷 | 1 |
| 2030 | 2022 年 7 月 29 日 | 磷 | 磷 | 50 -> 20JUL2022 和 17SEP2022 之間的天數,但從 PR 到 P 或 M 沒有變化,所以這個客戶對我們不感興趣,應該是 0 |
| 2030 | 2022 年 7 月 15 日 | 磷 | 磷 | 50 |
| 2030 | 2022 年 9 月 17 日 | 磷 | 磷 | 50 |
應該如何: 因為我們只對從 PR 到 P 或 M 的更改感興趣,所以本文底部的示例展示了它。下面的示例與本文底部的示例 ID = 223 或 402 類似:)
| ID | DT | OFFER_1 | OFFER_2 | COL1 |
|---|---|---|---|---|
| 1020 | 01SEP2020 | 磷 | 磷 | 0 |
| 1020 | 02SEP2020 | 磷 | 磷 | 0 |
| 2030 | 2022 年 7 月 29 日 | 磷 | 磷 | 0 |
| 2030 | 2022 年 7 月 15 日 | 磷 | 磷 | 0 |
| 2030 | 2022 年 9 月 17 日 | 磷 | 磷 | 0 |
如何在 PROC SQL 或普通 SAS 代碼中的 SAS Enterprise Guide 中做到這一點?
uj5u.com熱心網友回復:
如果offer_1是P或M,那么我們只需要獲取當前日期和前一個日期之間的差值。我們將根據您的規則使用一些規則來計算差異。從那里我們可以將最大值與原始資料連接起來。
proc sort data=have;
by id dt;
run;
data date_difs;
set have;
by id dt;
retain flag_pr_pm start_dt;
if(first.id) then call missing(flag_pr_pm, start_dt);
if(offer_1 = 'PR' AND offer_2 IN('P', 'M') ) then do;
flag_pr_pm = 1;
start_dt = dt;
end;
if( (offer_1 IN('P', 'M') AND offer_2 = 'PR')
OR (flag_pr_pm AND last.id AND NOT first.id)
)
then do;
flag_pr_pm = 0;
total_days = dt - start_dt;
end;
if( first.id
AND last.id
AND offer_1 = 'PR'
AND offer_2 IN ('P', 'M')
)
then total_days = 1;
format start_dt date9.;
run;
這讓你:
id dt offer_1 offer_2 flag_pr_pm start_dt total_days
11 20JAN2020 PR M 1 20JAN2020 .
11 05FEB2020 M M 0 20JAN2020 16
33 11AUG2020 M PR 0 . .
123 01MAY2020 PR PR . . .
123 05MAY2020 PR P 1 05MAY2020 .
123 10MAY2020 P P 1 05MAY2020 .
123 11MAY2020 P P 1 05MAY2020 .
123 20MAY2020 P PR 0 05MAY2020 15
123 21MAY2020 PR M 1 21MAY2020 .
123 25MAY2020 M M 0 21MAY2020 4
223 02JAN2020 PR PR . . .
223 15MAR2020 PR PR . . .
402 20MAR2020 M M . . .
777 30MAY2020 PR M 1 30MAY2020 1
1020 01SEP2020 P P . . .
1020 02SEP2020 P P . . .
2030 15JUL2022 P P . . .
2030 29JUL2022 P P . . .
2030 17SEP2022 P P . . .
現在將 ID 的最大值連接回原始資料:
proc sql;
create table want as
select *, col1
from have as t1
LEFT JOIN
(select id, max(total_days) as col1
from date_difs
group by id
) as t2
ON t1.id = t2.id
;
quit;
這為您提供了樣本資料中的精確解決方案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/510328.html
