สวัสดีค่ะ ไหนๆวันนี้เราก็ได้ Function ไป 1 แล้ว เอาเพิ่มไปอีกอันแล้วกันค่ะ เป็นเรื่องของการหารายใหม่ในปีของโรคนั้นๆ ...
ก่อนอื่นมาทำความเข้าใจกับคำว่ารายใหม่กันก่อนนะคะ สำหรับรายใหม่ที่จริงก็ขึ้นอยู่กับว่ารายงานเราต้องการอะไรมากกว่า
1.ต้องการรายใหม่ในปีงบประมาณ
นั่นคือ ผู้มารับบริการรายนั้น มารับบริการครั้งแรกในปีงบประมาณ (เช่น ปีงบประมาณ 2553 เริ่มจาก ตุลาคม 2552 - กันยายน 2553)
2.ต้องการรายใหม่ในปีปฏิทิน
นั่นคือ ผู้มารับบริการรายนั้น มารับบริการครั้งแรกในปีปฏิทิน (เช่น ปี 2553 เริ่มจาก มกราคม 2553 - ธันวาคม 2553)
จาก 2 ข้อข้างต้นที่กล่าวมานั้นเป็นการหาผู้ที่มารับบริการรายใหม่ในปี แต่ที่จะกล่าวถึงต่อไปนี้เป็นการหารายใหม่ในปีของโรคนั้นๆ หมายความว่า เราต้องการทราบว่า ผู้ที่มารับบริการและได้รับการวินิจฉัยนั้นเป็นครั้งแรกหรือไม่ (ปีปฏิทินนะคะ)
ซึ่งเราก็สามารถเอาความรู้เรื่อง Function มาช่วยเขียนเพื่อลดความซับซ้อนลงได้ค่ะ
Function check_newvisit_icd เป็น Function สำหรับตรวจสอบว่า นั้นเป็นรายใหม่ในปีของโรคนั้นหรือไม่ โดยผลที่ส่งออกมาจะ เป็นค่า
true = รายใหม่
false = รายเก่า
เอาคำสั่งนี้ไปรัน นะคะ (รันครั้งเดียวก็พอ)
CREATE OR REPLACE FUNCTION check_newvisit_icd (varchar, varchar, varchar, varchar) RETURNS bool AS
'
declare
patient_id varchar;
visit_id varchar;
visit_datetime varchar;
visit_icd10 varchar;
newvisit boolean;
check_visit record;
begin
patient_id = $1;
visit_id = $2;
visit_icd10 = $3;
visit_datetime = $4;
newvisit = true;
if (patient_id <> '''' and visit_id <> '''' and visit_datetime <> '''' and visit_icd10 <> '''')
then
for check_visit in select t_diag_icd10.diag_icd10_number as icd10
from t_visit inner join t_diag_icd10 on t_visit.t_visit_id = t_diag_icd10.diag_icd10_vn
where t_visit.t_visit_id <> visit_id
and t_visit.t_patient_id = patient_id
and t_diag_icd10.diag_icd10_active = ''1''
and t_diag_icd10.diag_icd10_number = visit_icd10
and substring(t_visit.visit_financial_discharge_time,1,4) = substring(visit_datetime,1,4)
and substring(t_visit.visit_financial_discharge_time,1,10) < substring(visit_datetime,1,10)
loop
if check_visit.icd10 is not null
then newvisit = false;
else
--กรณี Join กันไม่สำเร็จ
end if;
end loop;
else newvisit = true;
end if;
return newvisit;
end;
'
LANGUAGE 'plpgsql';
หลังจากนั้นเวลาเรียกใช้
select
t_visit.t_visit_id
,t_visit.t_patient_id
,t_visit.visit_vn
,t_visit.visit_financial_discharge_time
,t_diag_icd10.diag_icd10_number
-- บรรทัดข้างล่างเป็นการเรียกใช้
--โดยส่งค่า t_patient_id,t_visit_id,isit_financial_discharge_time,diag_icd10_number
,check_newvisit_icd(t_visit.t_patient_id,t_visit.t_visit_id,t_diag_icd10.diag_icd10_number,t_visit.visit_financial_discharge_time)
-- เป็นการดัดแปลงไปใช้งาน เพื่อแสดงผลตามที่ต้องการ โดยใช้ case เข้ามาช่วย เนื่องจากส่งค่า true กับ false จึงไม่ต้องมีเงื่อนไขอะไรอีก when ไปได้เลยค่ะ
,case when check_newvisit_icd(t_visit.t_patient_id,t_visit.t_visit_id,t_diag_icd10.diag_icd10_number,t_visit.visit_financial_discharge_time)
then 'รายใหม่'
else 'รายเก่า'
end
from t_visit inner join t_diag_icd10
on t_visit.t_visit_id = t_diag_icd10.diag_icd10_vn
where t_visit.f_visit_status_id <> '4'
and t_diag_icd10.diag_icd10_active = '1'
and substring(t_visit.visit_financial_discharge_time,1,10) = '2553-03-29';
* ส่วนเราจะปรับใช้อย่างไร ก็ได้ค่ะ ...
เขียนเรื่อง sql เยอะนะ ได้ประโยชน์มากครับอาจารย์โอ๋
ตอบลบขอบคุณค่ะ หน้าม้าหรือเปล่านิ ... อิอิ
ตอบลบถ้าต้องการรายใหม่ไม่ใช่ปีละ เอาใหม่แบบชาตินี้มาครั้งแรกละ เขียนไง
ตอบลบจะเอาไปใช้กับเบาหวานความดันใช่ป่าว อิอิ....
ตอบลบลองปรับดูค่ะ ก็เราไม่ต้องเอาเรื่องเวลาเข้ามาเกี่ยวข้อง ในตัวแปร visit_datetime ของ function ก็ไม่ต้องให้มีซะ ... ลองเองออกดูนะคะ
ขอทราบผลด้วยค่ะ เอาไปแชร์ใน webboard Hospital OS ก็ได้ค่ะ
t_visit_id ยังออกซ้ำอยู่
ตอบลบผมลองใส่ distinct ไมออกซ้ำแล้วแต่ไม่ร้ถูกหรือเปล่า
อีกย่าง เพราะรายใหม่จริงๆ เราควรเอาออกมาเฉพาะ เงื่อนไขที่เป็น true
เช็คว่า join อะไรที่ทำให้เบิ้ลบ้างค่ะ แต่ถ้าเอา SQL ข้างบน ไม่น่าจะเบิ้ล visit ค่ะ ถ้าเบิ้ลแสดงว่าข้อมูลมีปัญหาแล้วพี่น้อง
ตอบลบใช้ min(วันที) ไม่ได้เหรอ เอาวันที่ diag วันแรกของโรคที่เป็นรคเรื้อรัง
ตอบลบแล้วค่อย join กลับไป t_visit หรือ t_patient จะำด้ sqlที่ประมวลผลที่เร็วกว่า
leo
น่าสนใจค่ะ น่าจะเป็นอีกวิธีนึงที่น่าใช้ แล้วได้ลองเขียนออกมาหรือยังคะ เป็นอย่างไรบ้าง นำมาแบ่งปันกันบ้างนะคะ
ตอบลบ