Mine

รูปภาพของฉัน
หาดใหญ่, ภาคใต้, Thailand
ชอบเอาใจ แต่ก็เอาแต่ใจ

วันเสาร์ที่ 4 กันยายน พ.ศ. 2553

อยากทราบมั้ยว่าผู้ที่มารับบริการและได้รับการวินิจฉัยนั้นเป็นครั้งแรกในปีหรือไม่

สวัสดีค่ะ ไหนๆวันนี้เราก็ได้ 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';

* ส่วนเราจะปรับใช้อย่างไร ก็ได้ค่ะ ...

8 ความคิดเห็น:

  1. เขียนเรื่อง sql เยอะนะ ได้ประโยชน์มากครับอาจารย์โอ๋

    ตอบลบ
  2. ขอบคุณค่ะ หน้าม้าหรือเปล่านิ ... อิอิ

    ตอบลบ
  3. ถ้าต้องการรายใหม่ไม่ใช่ปีละ เอาใหม่แบบชาตินี้มาครั้งแรกละ เขียนไง

    ตอบลบ
  4. จะเอาไปใช้กับเบาหวานความดันใช่ป่าว อิอิ....
    ลองปรับดูค่ะ ก็เราไม่ต้องเอาเรื่องเวลาเข้ามาเกี่ยวข้อง ในตัวแปร visit_datetime ของ function ก็ไม่ต้องให้มีซะ ... ลองเองออกดูนะคะ
    ขอทราบผลด้วยค่ะ เอาไปแชร์ใน webboard Hospital OS ก็ได้ค่ะ

    ตอบลบ
  5. t_visit_id ยังออกซ้ำอยู่
    ผมลองใส่ distinct ไมออกซ้ำแล้วแต่ไม่ร้ถูกหรือเปล่า
    อีกย่าง เพราะรายใหม่จริงๆ เราควรเอาออกมาเฉพาะ เงื่อนไขที่เป็น true

    ตอบลบ
  6. เช็คว่า join อะไรที่ทำให้เบิ้ลบ้างค่ะ แต่ถ้าเอา SQL ข้างบน ไม่น่าจะเบิ้ล visit ค่ะ ถ้าเบิ้ลแสดงว่าข้อมูลมีปัญหาแล้วพี่น้อง

    ตอบลบ
  7. ไม่ระบุชื่อ4 เมษายน 2554 เวลา 00:32

    ใช้ min(วันที) ไม่ได้เหรอ เอาวันที่ diag วันแรกของโรคที่เป็นรคเรื้อรัง
    แล้วค่อย join กลับไป t_visit หรือ t_patient จะำด้ sqlที่ประมวลผลที่เร็วกว่า
    leo

    ตอบลบ
  8. น่าสนใจค่ะ น่าจะเป็นอีกวิธีนึงที่น่าใช้ แล้วได้ลองเขียนออกมาหรือยังคะ เป็นอย่างไรบ้าง นำมาแบ่งปันกันบ้างนะคะ

    ตอบลบ