SQL

ส่วนนี้จะเป็นพื้นฐานความรู้ทางด้าน SQL ที่ผมศึกษา และที่ได้เรียนรู้จากอาจารย์ทุกท่าน

ต่อไปจะเป็นตัวอย่างการทำ Data cleaning และ สรุปข้อมูล เพื่อตอบคำถามจากชุดข้อมูล โดยใช้พื้นฐานทางด้าน SQL มาตอบคำถามนะครับ

Work hard 💼
Play harder 😉
Learn hardest 📝

Stay Focus 🎧

จากชุดข้อมูลต่อไปนี้ ::

ข้อมูลพื้นที่เสี่ยงน้ำท่วมรายเดือนของแต่ละตำบลทั่วประเทศ ที่ผ่านการวิเคราะห์จาก shapefile พื้นที่น้ำท่วมจากภาพถ่ายดาวเทียมระหว่างปี 2548-2564 (รอบ 17 ปี)
ของสำนักงานพัฒนาเทคโนโลยีอวกาศและภูมิสารสนเทศ (สทอภ.) โดยผลการวิเคราะห์จะจำแนกได้เป็น 3 ประเภท ได้แก่ เสี่ยงต่ำ เสี่ยงปานกลาง และเสี่ยงสูง

คำถามที่ 1 : จงหาว่าจังหวัดใดมีจำนวนตำบลที่อาจจะได้รับผลกระทบจาก ความเสี่ยงสูง จากน้ำท่วมมากที่สุด

SELECT 
    	prov_e as city,
    	COUNT (risk) as count_city
 	from flood_risk_area
	where risk = 'เสี่ยงสูง'
    GROUP by city
    order by count_city desc

วิธีการหาคำตอบ

  • ขั้นตอนแรกทำการเปลี่ยนชื่อ coulumn : prov_e เป็น city เพื่อให้ง่ายต่อกาจดจำ
  • จากนั้นใช้ ฟังก์ชั่น Count เพื่อนับจำนวนความเสี่ยงของน้ำท่วม เป็น Column ใหม่ชื่อว่า count_city รวมทุกอำเภอ และใช้ where เพื่อหาพื้นที่ที่มี “ความเสี่ยงสูง”
  • ทำการดึงข้อมูลจาก dataset ที่ชื่อว่า flood_risk_area และทำการ Group by ด้วย column city แบ่งแยกออกมาเป็นจำนวน อำเภอ ตามชื่อจังหวัด
  • จากนั้นเรียงข้อมูล เพื่อให้ได้จังหวัดที่มีความเสี่ยงของอำเภอสูงสุดมาอยู่ข้างบน โดยใช้ Order by count_city

คำถามข้อที่ 2 : จังหวัดพระนครศรีอยุธยา มีจำนวนตำบลที่เสี่ยงได้รับผลกระทบจากน้ำท่วมในระดับ “เสี่ยงสูง” มากที่สุดกี่ตำบล แยกข้อมูลตามอำเภอ

SELECT 
	amphoe_e ,
    	count(tambon_e) as count_tombon
    FROM flood_risk_area
    WHERE prov_e = 'Phra Nakhon Si Ayudhya'
    and risk = 'เสี่ยงสูง'
    GROUP by amphoe_e
    order by count_tombon DESC

วิธีการหาคำตอบ

  • เลือก Column อำเภอ และ นับจำนวนตำบลทั้งหมดจาก dataset ก้อนนี้
  • โดยมีเงื่อนไขคือ ข้อมูลที่นับได้จะเอามาจาก ที่เฉพาะ column prov_e เป็นคำว่า ‘Phra Nakhon Si Ayudhya’ เท่านั้น
  • และเพิ่มอีกเงื่อนไขว่าจะต้องให้ column risk มีค่าเป็น “เสี่ยงสูง” เท่านั้น
  • ให้แสดงค่าออกมาเป็นจำนวนนับ แยกตามประเภท ชื่อใน column amphoe_e
  • และเรียงข้อมูลจากมากไปน้อย

คำถามข้อที่ 3 : เขตใดบ้างใน กรุงเทพที่มีความเสี่ยงมากที่สุด และแต่ละเขตได้รับผลกระทบกี่แขวง

SELECT 
		amphoe_e as khet,
        	COUNT(tambon_e) as count_khwaeng
        FROM flood_risk_area
        where prov_e = 'Bangkok'
        and risk = 'เสี่ยงปานกลาง'
        GROUP by khet
        

วิธีการหาคำตอบ

  • เลือกแสดง Column อำเภอ เปลี่ยนชื่อเป็น khet และนับจำนวนแขวง ให้แสดงที่ column count_khwaeng จาก dataset ก้อนนี้ และ column prov_e ต้องเป็นคำว่า ‘Bangkok’ เท่านั้น
  • โดยเงื่อนไขที่ว่าจะต้องให้ column risk มีค่าเป็น “เสี่ยงปานกลาง” เท่านั้น
    • เนื่องจากเสี่ยงสูงไม่มีข้อมูล
  • ให้แสดงค่าออกมาเป็นจำนวนนับ แยกตามประเภท ชื่อใน column khet

คำถามข้อที่ 4 : จงหาว่าอำเภอ และ ตำบลใดในจังหวัดน่าน ที่ได้รับผลกระทบบ่อยที่สุดในช่วงเดือนสิงหาคมย้อนหลัง 17 ปี และระดับความเสี่ยงเป็นเท่าไหร่จากข้อมูลชุดนี้

select 
	tambon_e ,
	amphoe_e , 
        criteria,
        risk,
        sum (count_17_year) as Total_nan
    FROM flood_risk_area
    where prov_e = 'Nan'
          AND month = 8
    Group by tambon_e

วิธีการหาคำตอบ

  • เลือกแสดง Column ตำบล / อำเภอ / ความถี่ของการประสบภัย / ระดับความเสี่ยง และ นับจำนวนครั้งที่ได้รับผลกระทบในรอบ 17 ปีที่ผ่านมา เปลี่ยนชื่อเป็น column Total_nan เพื่อให้ง่ายต่อการจดจำ ตามลำดับ จาก dataset ก้อนนี้
  • โดยเงื่อนไขที่ว่าจะต้องให้ column prov_e มีค่าเป็น จังหวัด ‘น่าน’ และ column month มีค่าเป็น 8 (สิงหาคม) เท่านั้น
  • ให้แสดงค่าออกมาเป็น อำเภอ และตำบล ที่ระดับความเสี่ยง และได้รับผลกระทบ มากที่สุด

คำถามที่ 5 : จังหวัดใดที่ได้รับผลกระทบจากน้ำท่วมน้อยที่สุด

SELECT prov_e as city ,
	sum (count_17_year) as count_city 
    FROM flood_risk_area
    GROUP by prov_e
    ORDER by count_city

วิธีการหาคำตอบ

  • เลือกแสดง column prov_e เปลี่ยนชื่อเป็น city คือจังหวัด และจำนวนผลรวมของการได้รับผลกระทบย้อนหลัง 17 ปี แสดงค่าเป็น column count_city จาก dataset ก้อนนี้
  • โดยแสดงค่าตาม จังหวัดที่ได้ผลกระทบ
  • เมื่อได้ค่าเรียบร้อย ให้ทำการเรียงลำดับจาก น้อยไปมาก เพื่อให้ง่ายต่อการตรวจสอบ