ผู้เขียน หัวข้อ: หาข้อมูลในวันที่ผู้ป่วยมาโรงพยาบาลครั้งหลังสุด จาก sql code คำสั่งเดียว  (อ่าน 25147 ครั้ง)

0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้

ออฟไลน์ sumkiat

  • Jr. Member
  • **
  • กระทู้: 59
  • Respect: +1
    • ดูรายละเอียด
คือ ต้องการหาว่าผู้ป่วยมาโรงพยาบาลครั้งหลังสุด วันที่ ?
ที่ลองทำ ใช้ table patient เชื่อมกับ vn_stat
ตาม code
select a.hn,b.vstdate from patient a left outer join vnstat on a.hn=b.hn group by hn order by hn
ปรากฎว่า ได้เป็น วันที่มาโรงพยาบาลครั้งแรก
ถ้าต้องการรายการสุดท้ายของแต่ละ hn ต้องเขียน Code อย่างไร
รพ.มะการักษ์ 240 เตียง
เริ่มระบบ HOSxP 1 ธค 48  , HOSxP: 3.56.9.30
Server : Ram 128 GB. centos 6.4 (64 bit) , MySQL 5.5.31

ออฟไลน์ golf_win

  • Hero Member
  • *****
  • กระทู้: 3,481
  • Respect: +112
    • ดูรายละเอียด
คือ ต้องการหาว่าผู้ป่วยมาโรงพยาบาลครั้งหลังสุด วันที่ ?
ที่ลองทำ ใช้ table patient เชื่อมกับ vn_stat
ตาม code
select a.hn,b.vstdate from patient a left outer join vnstat on a.hn=b.hn group by hn order by hn
ปรากฎว่า ได้เป็น วันที่มาโรงพยาบาลครั้งแรก
ถ้าต้องการรายการสุดท้ายของแต่ละ hn ต้องเขียน Code อย่างไร
ลองแบบนี้ครับ
select hn,max(vstdate) as vstdate from vn_stat
group by hn
order by hn desc

หรือ
select p.hn,max(v.vstdate) as vstdate from patient p
left outer join vn_stat v on v.hn=p.hn
group by p.hn
order by p.hn desc
« แก้ไขครั้งสุดท้าย: ธันวาคม 09, 2011, 13:15:35 PM โดย golf_win »
โรงพยาบาลเจ็ดเสมียน จังหวัดราชบุรี
Start 19-1-51    35 station
HOSxP  3.59.5.18 Activate License
Tel. 032-305096-7 ต่อ 118
Web. http://csmhos.thaiddns.com:8080
         http://csmhos.thaieasydns.com:8080

ออฟไลน์ sumkiat

  • Jr. Member
  • **
  • กระทู้: 59
  • Respect: +1
    • ดูรายละเอียด
มีปัญหาเพิ่มอีกหน่อย
ถ้าผมเพิ่มฟิลด์ age_y ที่อยู่ใน vn_stat
เป็นดังข้างล่าง
select p.hn,max(v.vstdate) as vstdate,v.age_y from patient p
left outer join vn_stat v on v.hn=p.hn
group by p.hn
order by p.hn desc
ปัญหาที่พบคือ คือ max(v.vstdate)  จะได้เป็นข้อมูล record ท้ายสุดของแต่ละ hn
แต่ age_y ไม่ใช่ record เดียวกับ v.vstdate
คือถ้าต้องการ age_y recod เดียวกับ max(v.vstdate) จะเขียนอย่างไร
รพ.มะการักษ์ 240 เตียง
เริ่มระบบ HOSxP 1 ธค 48  , HOSxP: 3.56.9.30
Server : Ram 128 GB. centos 6.4 (64 bit) , MySQL 5.5.31

ออฟไลน์ nahos

  • Hero Member
  • *****
  • กระทู้: 2,216
  • รพ.นาแห้ว
  • Respect: +7
    • ดูรายละเอียด
    • รพ.นาแห้ว
ถ้าำคำถามท่านได้คำตอบที่ต้องการจากอาจารย์ท่านใด กรุณากด Thank เบา ๆ ^ ถูกใจกด [applaud] ไม่ชอบใจกด[smite]
>> การโพสต์ขอรายงานที่ดี <<
อ่านซักนิด ถามยังไงให้ได้คำตอบ ? :)
วิธีแสดงตัวว่าเป็นใคร โดย อ.อ๊อด (ให้ข้อมูลว่าเป็นใคร ปฏิบัติงานที่ไหน ใช้ server อะไร OS อะไร HOsxp Vไหน)
ก่อนที่จะตั้งกระทู้ถาม ลองค้นจากกระทู้เก่าดูก่อนไหม จะได้คำตอบเร็วกว่าการรอคำตอบนะ
..........................................................................
เจษ จพ.เภสัชกรรมฯ user@ NAHAEO HOSPITAL LOEI. <br>  Supervise by DANSAI HOSPITAL LOEI. <br>
Start 01/03/2550
=> Server IBM X3200 Ram 6 Gb. OS:Cent OS 6.0  
=> Client 20 client  OS: SP2  => HosXP Version <b>3.56.11.19</b>
-----------------------------
น้ำเต็มแก้ว "การเรียนรู้ไม่มีที่สิ้นสุด"

ออฟไลน์ golf_win

  • Hero Member
  • *****
  • กระทู้: 3,481
  • Respect: +112
    • ดูรายละเอียด
max(v.age_y)
ตาม อ.nahos ครับ
สรุปเป็น

select p.hn,max(v.vstdate) as vstdate,max(age_y) as age_y from patient p
left outer join vn_stat v on v.hn=p.hn
group by p.hn
order by p.hn desc
โรงพยาบาลเจ็ดเสมียน จังหวัดราชบุรี
Start 19-1-51    35 station
HOSxP  3.59.5.18 Activate License
Tel. 032-305096-7 ต่อ 118
Web. http://csmhos.thaiddns.com:8080
         http://csmhos.thaieasydns.com:8080

ออฟไลน์ sumkiat

  • Jr. Member
  • **
  • กระทู้: 59
  • Respect: +1
    • ดูรายละเอียด
select p.hn,max(v.vstdate) as vstdate,max(age_y) as age_y from patient p
left outer join vn_stat v on v.hn=p.hn
group by p.hn
order by p.hn desc
ลอง test แล้ว พบข้อผิดพลาดคือ ถ้า age_y ตัวข้อมูลไม่ได้เรียงตามลำดับจากน้อยไปหามาก
เช่น hn 3555 วัดเกิดผิด เดิมอายุ 20 ปี เมือเดือน พย.  แต่มาตรวจใหม่ ณ ธค. จึงแก้วันเกิดให้ลดลง
อาจเหลือ 17 ปี ถ้า run sql code นี้ ก็จะได้
3555,   2011-12-01,    20
แต่คำตอบที่ต้องการคือ
3555,   2011-12-01,    17  เพราะนี่คือรายการสุดท้าย

คือถ้ามีการนำฟิลด์อื่นที่อยู่ใน vn_stat มาแสดงด้วย ก็จะทำให้ไม่ได้ข้อมูลรายการสุดท้าย
(โปรดช่วยต่ออีกหน่อย)
« แก้ไขครั้งสุดท้าย: ธันวาคม 13, 2011, 09:52:54 AM โดย sumkiat »
รพ.มะการักษ์ 240 เตียง
เริ่มระบบ HOSxP 1 ธค 48  , HOSxP: 3.56.9.30
Server : Ram 128 GB. centos 6.4 (64 bit) , MySQL 5.5.31

ออฟไลน์ golf_win

  • Hero Member
  • *****
  • กระทู้: 3,481
  • Respect: +112
    • ดูรายละเอียด
select p.hn,max(v.vstdate) as vstdate,max(age_y) as age_y from patient p
left outer join vn_stat v on v.hn=p.hn
group by p.hn
order by p.hn desc
ลอง test แล้ว พบข้อผิดพลาดคือ ถ้า age_y ตัวข้อมูลไม่ได้เรียงตามลำดับจากน้อยไปหามาก
เช่น hn 3555 วัดเกิดผิด เดิมอายุ 20 ปี เมือเดือน พย.  แต่มาตรวจใหม่ ณ ธค. จึงแก้วันเกิดให้ลดลง
อาจเหลือ 17 ปี ถ้า run sql code นี้ ก็จะได้
3555,   2011-12-01,    20
แต่คำตอบที่ต้องการคือ
3555,   2011-12-01,    17  เพราะนี่คือรายการสุดท้าย

คือถ้ามีการนำฟิลด์อื่นที่อยู่ใน vstdate มาแสดงด้วย ก็จะทำให้ไม่ได้ข้อมูลรายการสุดท้าย
(โปรดช่วยต่ออีกหน่อย)
งั้นลองแบบนี้ครับ

select p.hn,max(v.vstdate) as vstdate,timestampdiff(year,p.birthday,max(v.vstdate)) as count_year from patient p
left outer join vn_stat v on v.hn=p.hn
group by p.hn
order by p.hn desc

หรือแบบนี้กรณีเอาเฉพาะผู้ที่เคยมารับบริการที่โรงพยาบาลครับ

select p.hn,max(v.vstdate) as vstdate,timestampdiff(year,p.birthday,max(v.vstdate)) as count_year from patient p
left outer join vn_stat v on v.hn=p.hn
where p.hn in (select hn from ovst)
group by p.hn
order by p.hn desc
« แก้ไขครั้งสุดท้าย: ธันวาคม 09, 2011, 18:53:43 PM โดย golf_win »
โรงพยาบาลเจ็ดเสมียน จังหวัดราชบุรี
Start 19-1-51    35 station
HOSxP  3.59.5.18 Activate License
Tel. 032-305096-7 ต่อ 118
Web. http://csmhos.thaiddns.com:8080
         http://csmhos.thaieasydns.com:8080

ออฟไลน์ udomchok

  • Hero Member
  • *****
  • กระทู้: 8,357
  • Respect: +589
    • ดูรายละเอียด
    • ร.พ.สมเด็จพระสังฆราช องค์ที่ 17
select v.hn, v.vn, v.vstdate, v.age_y
from vn_stat v
join (select v2.hn, max(v2.vstdate) max_vstdate from vn_stat v2 group by hn limit 100) temp on temp.hn=v.hn and temp.max_vstdate=v.vstdate
ทำด้วยหัวใจร.พ.สมเด็จพระสังฆราช องค์ที่ 17 อ.สองพี่น้อง จ.สุพรรณบุรี
อบรมโดย BMS Team เมื่อ พ.ย. 49 ขึ้นระบบห้องบัตรเมื่อ X'Mas 2007
2008 : X-Ray กายภาพบำบัด แพทย์แผนไทย กิจกรรมบำบัด OPD ตา
2009 : ทันตกรรม ห้องตรวจตา OPD (พยาบาลและห้องตรวจแพทย์บางห้อง)

ออฟไลน์ udomchok

  • Hero Member
  • *****
  • กระทู้: 8,357
  • Respect: +589
    • ดูรายละเอียด
    • ร.พ.สมเด็จพระสังฆราช องค์ที่ 17
อันนี้จะดีกว่าครับ เผื่อมี 2 visit ใน 1 วัน จะได้แสดง visit ล่าสุดจริง ๆ
select v.hn, v.vn, v.vstdate, v.age_y
from vn_stat v
join (select v2.hn, max(v2.vn) max_vn from vn_stat v2 group by hn limit 1000) temp on temp.hn=v.hn and temp.max_vn=v.vn
ทำด้วยหัวใจร.พ.สมเด็จพระสังฆราช องค์ที่ 17 อ.สองพี่น้อง จ.สุพรรณบุรี
อบรมโดย BMS Team เมื่อ พ.ย. 49 ขึ้นระบบห้องบัตรเมื่อ X'Mas 2007
2008 : X-Ray กายภาพบำบัด แพทย์แผนไทย กิจกรรมบำบัด OPD ตา
2009 : ทันตกรรม ห้องตรวจตา OPD (พยาบาลและห้องตรวจแพทย์บางห้อง)

ออฟไลน์ มนตรี บอยรักยุ้ยคนเดียว

  • Hero Member
  • *****
  • กระทู้: 5,369
  • Respect: +12
    • ดูรายละเอียด
    • โรงพยาบาลชุมชน ด่านมะขามเตี้ย
คือถ้ามีการนำฟิลด์อื่นที่อยู่ใน vstdate มาแสดงด้วย ก็จะทำให้ไม่ได้ข้อมูลรายการสุดท้าย
(โปรดช่วยต่ออีกหน่อย)
งั้นลองแบบนี้ครับ

select p.hn,max(v.vstdate) as vstdate,timestampdiff(year,p.birthday,max(v.vstdate)) as count_year from patient p
left outer join vn_stat v on v.hn=p.hn
group by p.hn
order by p.hn desc

หรือแบบนี้กรณีเอาเฉพาะผู้ที่เคยมารับบริการที่โรงพยาบาลครับ

select p.hn,max(v.vstdate) as vstdate,timestampdiff(year,p.birthday,max(v.vstdate)) as count_year from patient p
left outer join vn_stat v on v.hn=p.hn
where p.hn in (select hn from ovst)
group by p.hn
order by p.hn desc

ตาม กอล์ฟ เลย
เริ่ม11พย.2548OPD-Paperlessพร้อมHOSxPลดโลกร้อน
IPD-Lesspaper1ตค2560ระบบDmsByNeoNetwork
IPD-Paperless1พ.ค2562ระบบHOSxPXE4
MT-Oracle9.3+MariaDB-10.4.xx,SL-Oracle9.3+MariaDB-11.0.xx
LOG=MySQL-8.4.xx,INV=PostgreSQL11

ออฟไลน์ sumkiat

  • Jr. Member
  • **
  • กระทู้: 59
  • Respect: +1
    • ดูรายละเอียด
ขอรบกวนทุกท่านอีกนิดหนึ่ง

ผมขออนุญาติอธิบายและปรับโจทย์ ให้กระทัดรัด ดังนี้
คือว่า ถ้าผมมี 2 ตาราง
ตารางที่ 1 ชื่อ patient ประกอบด้วย 3 ฟิลด์
- hn
- fname
- lname
ตารางที่ 2 ชือ vn_stat ประกอบด้วย 5 ฟิลด์
- hn
- vstdate
- age_y
- age_m
- age_d
แล้วนำ table patient เชื่อมกับ vn_stat
ได้ code
select a.hn,a.fname,a.lname,b.vstdate,b.age_y,b.age_m
 from patient a left outer join vnstat on a.hn=b.hn group by hn order by hn
มีเงื่อนไขคือให้ใช้ฟิลด์ เฉพาะที่ระบุ ใน 2 ตารางด้านบน เท่านั้น
เพิ่อหารายการล่าสุดของคนใข้แต่ละคน นั้นคือการหารายการสุดท้ายของแต่ละ hn ใน vn_stat
ถามว่าจะสามารถหาได้ไหม
ถ้าได้จะเขียน code อย่างไร
รพ.มะการักษ์ 240 เตียง
เริ่มระบบ HOSxP 1 ธค 48  , HOSxP: 3.56.9.30
Server : Ram 128 GB. centos 6.4 (64 bit) , MySQL 5.5.31

ออฟไลน์ golf_win

  • Hero Member
  • *****
  • กระทู้: 3,481
  • Respect: +112
    • ดูรายละเอียด
อยากรู้ครับว่าต้องการเอาข้อมูลไปทำอะไรต่อครับ
โรงพยาบาลเจ็ดเสมียน จังหวัดราชบุรี
Start 19-1-51    35 station
HOSxP  3.59.5.18 Activate License
Tel. 032-305096-7 ต่อ 118
Web. http://csmhos.thaiddns.com:8080
         http://csmhos.thaieasydns.com:8080

ออฟไลน์ nahos

  • Hero Member
  • *****
  • กระทู้: 2,216
  • รพ.นาแห้ว
  • Respect: +7
    • ดูรายละเอียด
    • รพ.นาแห้ว
จะเอา code นี้ไปทำอะไรครับ ???

code ที่ อ.udomchok เขียนไว้ก็ได้ครับ เพราะ เอา max vn มาใช้แล้ว

select v.hn, v.vn, v.vstdate, v.age_y ,v.age_m,p.lname,p.fname
from vn_stat v
left join patient p on p.hn=v.hn
join (select v2.hn, max(v2.vn) max_vn from vn_stat v2 group by hn limit 1000)
temp on temp.hn=v.hn and temp.max_vn=v.vn

ถ้าำคำถามท่านได้คำตอบที่ต้องการจากอาจารย์ท่านใด กรุณากด Thank เบา ๆ ^ ถูกใจกด [applaud] ไม่ชอบใจกด[smite]
>> การโพสต์ขอรายงานที่ดี <<
อ่านซักนิด ถามยังไงให้ได้คำตอบ ? :)
วิธีแสดงตัวว่าเป็นใคร โดย อ.อ๊อด (ให้ข้อมูลว่าเป็นใคร ปฏิบัติงานที่ไหน ใช้ server อะไร OS อะไร HOsxp Vไหน)
ก่อนที่จะตั้งกระทู้ถาม ลองค้นจากกระทู้เก่าดูก่อนไหม จะได้คำตอบเร็วกว่าการรอคำตอบนะ
..........................................................................
เจษ จพ.เภสัชกรรมฯ user@ NAHAEO HOSPITAL LOEI. <br>  Supervise by DANSAI HOSPITAL LOEI. <br>
Start 01/03/2550
=> Server IBM X3200 Ram 6 Gb. OS:Cent OS 6.0  
=> Client 20 client  OS: SP2  => HosXP Version <b>3.56.11.19</b>
-----------------------------
น้ำเต็มแก้ว "การเรียนรู้ไม่มีที่สิ้นสุด"

ออฟไลน์ sumkiat

  • Jr. Member
  • **
  • กระทู้: 59
  • Respect: +1
    • ดูรายละเอียด
คือ เคยเจอโจทย์ ลักษณะคล้าย กับที่อธิบายมา
กับอีกฐานข้อมูล จำนวนฟิลด์ น้อยกว่าใน hosxp
ซึ่งมันนานมาแล้ว แต่ก็ยังแก้ไขไม่ได้ ก็นานจนลืม
แล้วตอนนี้ ก็ได้โจทย์ ตามที่อธิบายไป
ก็ใช้ left outer join กับ group by มันก็น่าจะตอบโจทย์ได้แล้ว
แต่ การ group by ใน mysql ค่าที่ได้ถ้าซ้ำ ก็จะไปเลือกเอารายการแรก
จึงอยากรู้ว่า จะทำอย่างไร ให้ใช้ group by ถ้าซ้ำ แล้วไปหยิบเอารายการสุดท้ายแทน
เพราะผมรู้สึกว่า มันอีกแค่นิดเดียว
คือไม่อยากเขียนยาวๆ แต่ถ้าไม่ได้จริงๆ ก็คงต้องเขียน code ยาวๆ ตามที่ทุกท่านได้ post มา
รพ.มะการักษ์ 240 เตียง
เริ่มระบบ HOSxP 1 ธค 48  , HOSxP: 3.56.9.30
Server : Ram 128 GB. centos 6.4 (64 bit) , MySQL 5.5.31

ออฟไลน์ redfireball

  • Full Member
  • ***
  • กระทู้: 219
  • คุณแม่ขอร้อง..ร้อง....
  • Respect: +4
    • ดูรายละเอียด
hosxp จะ stamp วันที่มารับบริการครั้งสุดท้าย last_visit ไว้ที่ ตาราง patient อยู่แล้วครับ  :) :)
โรงพยาบาลสังคม
SANGKHOM HOSPITAL
30 เตียง อ.สังคม จ.หนองคาย
http://www.sangkhomhospital.com
ขึ้นระบบ 5 ธ.ค. 51

ออฟไลน์ มนตรี บอยรักยุ้ยคนเดียว

  • Hero Member
  • *****
  • กระทู้: 5,369
  • Respect: +12
    • ดูรายละเอียด
    • โรงพยาบาลชุมชน ด่านมะขามเตี้ย
คือ เคยเจอโจทย์ ลักษณะคล้าย กับที่อธิบายมา
กับอีกฐานข้อมูล จำนวนฟิลด์ น้อยกว่าใน hosxp
ซึ่งมันนานมาแล้ว แต่ก็ยังแก้ไขไม่ได้ ก็นานจนลืม
แล้วตอนนี้ ก็ได้โจทย์ ตามที่อธิบายไป
ก็ใช้ left outer join กับ group by มันก็น่าจะตอบโจทย์ได้แล้ว
แต่ การ group by ใน mysql ค่าที่ได้ถ้าซ้ำ ก็จะไปเลือกเอารายการแรก
จึงอยากรู้ว่า จะทำอย่างไร ให้ใช้ group by ถ้าซ้ำ แล้วไปหยิบเอารายการสุดท้ายแทน
เพราะผมรู้สึกว่า มันอีกแค่นิดเดียว
คือไม่อยากเขียนยาวๆ แต่ถ้าไม่ได้จริงๆ ก็คงต้องเขียน code ยาวๆ ตามที่ทุกท่านได้ post มา
พี่ครับ จะเอาไปทำอะไรครับ
เริ่ม11พย.2548OPD-Paperlessพร้อมHOSxPลดโลกร้อน
IPD-Lesspaper1ตค2560ระบบDmsByNeoNetwork
IPD-Paperless1พ.ค2562ระบบHOSxPXE4
MT-Oracle9.3+MariaDB-10.4.xx,SL-Oracle9.3+MariaDB-11.0.xx
LOG=MySQL-8.4.xx,INV=PostgreSQL11

ออฟไลน์ sumkiat

  • Jr. Member
  • **
  • กระทู้: 59
  • Respect: +1
    • ดูรายละเอียด
อยากลองดูว่าจะเขียน code ให้สั้นๆ ได้ไหม ?
รพ.มะการักษ์ 240 เตียง
เริ่มระบบ HOSxP 1 ธค 48  , HOSxP: 3.56.9.30
Server : Ram 128 GB. centos 6.4 (64 bit) , MySQL 5.5.31

ออฟไลน์ pop_hosxp

  • Hero Member
  • *****
  • กระทู้: 3,137
  • Respect: +40
    • ดูรายละเอียด
    • Phanomphrai Hospital
select hn from patient คำสั่งเดียวครับ

ทีนี้ใน report designer วาง variable ชนิด date ลงไปหนึ่งตัว แล้วใช้คำสั่ง

value:=GetSQLDateData('select vstdate from vn_stat where hn="'+datapipeline['hn']+'" order by vstdate desc limit 1');
pop434241@gmail.com
รพ.พนมไพร จ.ร้อยเอ็ด https://pnphos.moph.go.th/hosweb/

ออฟไลน์ surachat1234

  • Newbie
  • *
  • กระทู้: 28
  • Respect: 0
    • ดูรายละเอียด
ลองทดสอบมั้ง

SELECT vs.hn,vs.vstdate,vs.age_y,vs.age_m,vs.age_d,
p.hn,p.fname,p.lname
FROM (SELECT * FROM vn_stat ORDER BY vstdate DESC) AS vs
INNER JOIN patient p ON p.hn = vs.hn
GROUP BY vs.hn
โรงพยาบาลส่งเสริมสุขภาพตำบลหนองกรด ตำบลสระแก้ว จังหวัดกำแพงเพชร
web : http://nongkrod.thaiddns.com
Server : IBM X3100 Intel Xeon Quad-Core  2.66GHz/1333MHz  10Gb. Centos 5.7 64 bit, Percona-Server-server-51-5.1.56 
ขึ้นระบบเมื่อ 1 ธ.ค. 2553 โดยทีมงานไอทีจังหวัดกำแพงเพชรและโรงพยาบาลกำแพงเพชร

ออฟไลน์ wauy

  • Full Member
  • ***
  • กระทู้: 192
  • Respect: +3
    • ดูรายละเอียด
SELECT vs.hn,vs.vstdate,vs.age_y,vs.age_m,vs.age_d,
concat(p.pname,p.fname,'    ',p.lname) as ptname,vs.vn,vs.pdx,vs.cid,vs.income
FROM (SELECT * FROM vn_stat ORDER BY vstdate DESC) AS vs
INNER JOIN patient p ON p.hn = vs.hn
GROUP BY vs.hn
เพิ่มรายละเอียด.....อิอิอิอิ....
รพช.รัตนบุรี
จ.สุรินทร์  ขึ้นระบบ 5 มีนาคม 2549
ทีม อ.อ็อด,อ.สุชัย ,อ.บอย ไพรัตน์ และทีม BMS