프리랜서/CDW

[데이터 개발] PSA nadir 구현 방법

멋쟁이천재사자 2022. 9. 26. 14:11

PSA Nadir 개념

PSA nadir 는 전립선비대증이나 전립선암 치료(수술이나 RT)후에 측정한 PSA 수치중 최저값을 의미합니다.

개념은 단순한 것 같지만, SQL 개발을 위한 엄밀한 정의는 복잡해집니다.

최저값 산출의 대상이 되는 범위 결정이 필요합니다. 
치료 이후부터 언제까지를 대상으로 할지가 문제입니다. 
치료 이후 결과가 좋아서 0.3 최저 찍고 치료를 종료하였는데 몇 년이 지나 재발하여 다시 증가해서 치료받고 예전 최저치보다 더 낮은 수치인 0.1로 떨어졌다고 가정해보죠.
여기에서 구하고자 하는 최저치는 0.1 이 아닌 0.3 입니다.

PSA 수치도 검사 장비의 성능에 따라 정밀도가 달라지므로, 어느 정도 수준으로 판단할지도 정리가 필요할 수 있습니다.
0.01 수준으로 측정되는 장비를 사용하는 경우 실제로는 0.003 일 수 있는데 0.01로 측정되었고,
일주일 후 0.001 로 측정되는 고성능의 장비로 측정하여 0.009 가 나왔다고 가졍해보죠.
형식적으로는 0.01 다음 0.009 이므로 0.009 가 최소값이지만 실제로는 0.01 이 PSA nadir 입니다.

 

참고를 위해 PSA nadir 와 관련된 글 몇 개를 링크합니다.

 

https://www.goldjournal.net/article/S0090-4295(17)30742-2/fulltext 

https://blog.naver.com/urobyun/222138778201

 

데이터 개발 요건 정의

PSA Nadir 는 수술이후부터 추가적인 치료 이전까지의 기간에 측정된 PSA 수치중 가장 작은 값으로 한다. 
다만, PSA 가 0.01 이하이면 최초 수치를 Nadir 로 간주한다.

 

INPUT_DATA

 

1,2 두 환자(ID) 모두 2022년 01월 04일 수술을 받았다. 수술직후를 포함하여 4~5회의 검사를 했다.

 

목표 결과

1번 환자는 2월5일 0.3 

2번 환자는 2월6일 0.009  이다.

 

SQL 구현



WITH INPUT_DATA AS(
SELECT 1 AS ID,'20220104' AS DD, 0.5 AS PSA FROM DUAL
UNION ALL SELECT 1 AS ID,'20220205' AS DD, 0.3 AS PSA FROM DUAL
UNION ALL SELECT 1 AS ID,'20220510' AS DD, 0.4 AS PSA FROM DUAL
UNION ALL SELECT 1 AS ID,'20220515' AS DD, NULL AS PSA FROM DUAL
UNION ALL SELECT 1 AS ID,'20220720' AS DD, 0.35 AS PSA FROM DUAL
UNION ALL SELECT 2 AS ID,'20220105' AS DD, 0.05 AS PSA FROM DUAL
UNION ALL SELECT 2 AS ID,'20220206' AS DD, 0.009 AS PSA FROM DUAL
UNION ALL SELECT 2 AS ID,'20220207' AS DD, 0.008 AS PSA FROM DUAL
UNION ALL SELECT 2 AS ID,'20220511' AS DD, 0.005 AS PSA FROM DUAL
UNION ALL SELECT 2 AS ID,'20220721' AS DD, 0.02 AS PSA FROM DUAL
)
--select * from INPUT_DATA
, STEP1 AS ( 
SELECT ID,DD,PSA
,CASE WHEN PSA < 0.01 THEN 0.01 ELSE PSA END AS ADJ_PSA -- 0.01 이하는 0.01 로 본다. 조정된(ADJusted) PSA
FROM INPUT_DATA
)
--select * from STEP1
,STEP2 AS (
SELECT ID,DD,PSA,ADJ_PSA
-- (조정된)PSA 기준으로 가장 낮은 값일 때의 첫번째 일자
,FIRST_VALUE(DD) OVER (PARTITION BY ID ORDER BY ADJ_PSA) AS NADIR_DATE 
FROM STEP1
)
--select * from STEP2
SELECT 
ID
--,MIN(ADJ_PSA)    AS NADIR_PSA 
,MIN(PSA)    AS NADIR_PSA
,MIN(NADIR_DATE) AS NDIR_DATE 
FROM STEP2
WHERE DD = NADIR_DATE
GROUP BY ID