แผนการเรียนรู้
/
AMMS 302 | Week 9

สอบกลางภาค 📝

Midterm — Review & Exam Guide

ครอบคลุมสัปดาห์ 1–8 · ทฤษฎี + ปฏิบัติ (ตามแผนการสอน: การสอบปฏิบัติงาน/ทฤษฎีในชั้นเรียน)

🎯 สิ่งที่สไลด์ชุดนี้ให้

  • ขอบเขตสอบ + สัดส่วนคะแนน (จาก syllabus)
  • Recap ทีละสัปดาห์ พร้อม cheat-sheet links
  • โน้ตบุ๊ก mock exam พร้อมเฉลย: week09-midterm-review.ipynb
  • Checklist เตรียมตัววันสอบ

สารบัญ

01 · รูปแบบข้อสอบ & ขอบเขต

🧠 Part A: ทฤษฎี (~40%)

  • Concept ฐานข้อมูลเชิงสัมพันธ์ / PK-FK
  • OLTP vs DW vs Lake
  • NULL logic · JOIN types · WHERE vs HAVING
  • CSV/JSON/FHIR structure

💻 Part B: ปฏิบัติ SQL (~35%)

  • เขียน SELECT/WHERE/ORDER BY/LIMIT
  • GROUP BY + HAVING บน healthinfo.db
  • JOIN patients×prescriptions

🐼 Part C: pandas (~25%)

  • read_csv/clean/save (preprocessing flow)
  • merge/groupby.agg เทียบ SQL
  • Boolean indexing cohort
📖 ขอบเขต = ทุกอย่างใน wk01–wk07 slides + notebooks (ไม่รวม wk08 ที่ยังไม่สอนเชิงลึก) — ทุก cheat sheet ของสัปดาห์ 5–7 สรุปไว้ท้ายสไลด์แต่ละชุดแล้ว

02 · สัดส่วนคะแนนรวมทั้งภาค (จาก Syllabus)

50%

สอบทฤษฎี+ปฏิบัติ
(กลาง+ปลาย)

20%

Homework
สัปดาห์ละชุด

20%

Project กลุ่ม
(ERD สปสช.)

10%

Presentation
สัปดาห์ 16

💡 Midterm นับใน 50% ข้างต้น — HW ที่ส่งครบทุกสัปดาห์ช่วยดันเกรดก่อนสอบปลายภาค · ตารางเต็มดูที่ แผนการเรียนรู้

03 · Recap Week 1–2 — pandas & Linking

Week 1: Pre-processing

df = pd.read_csv('patients_data.csv')
df.shape; df.dtypes; df.head()
df.isnull().sum()                    # นับ NULL
df.dropna(subset=['HbA1c_level'])
df['bp'].fillna(df['bp'].mean())     # impute
df = df[(df.Age>=0)&(df.Age<=89)]    # validity
pd.to_datetime(df['admission_date'])
df.to_csv('clean.csv', index=False)
json.load(open('patient_fhir_demo.json'))
pd.json_normalize(rec, record_path=['entry'])

Week 2: Merge & GroupBy

pd.merge(rx, reg, on='practice_code',
         how='left')                 # LEFT JOIN
g = df.groupby('practice_name').agg(
    total=('cost','sum'),
    avg=('cost','mean'),
    n=('items','count')).reset_index()
# HAVING:
g[g['n'] > 50].sort_values('total', ascending=False)
🎯 คำถามชื่นใน exam: pd.merge how='left' ≡ SQL LEFT JOIN · split-apply-combine ≡ GROUP BY

04 · Recap Week 3–4 — Insights & Architecture

Week 3: Boolean Indexing

mask = (df.gender=='female') & \
      (df.age>=60) & (df.hba1c>7)   # วงเล็บ!
cohort = df.loc[mask]
df[df['DRUG'].isin(['METFORMIN','INSULIN'])]
df.info(); df.describe()
invalid = df[df.dischtime < df.admittime]

& | ~ (bitwise) — and/or ธรรมดา error!

Week 4: Architecture

FeatureDWLake
Datastructuredraw all
Schemaon-writeon-read
ETLExtract → Transform → Load (pipeline สู่ DW)

PySynthea (tietai-synthea) = Python-native synthetic patient generator (แทน Synthea Java)

05 · Recap Week 5 — DDL / DML / PK

CREATE TABLE IF NOT EXISTS patients(
 patient_id INTEGER PRIMARY KEY,
 hn TEXT UNIQUE NOT NULL,
 systolic_bp REAL CHECK(systolic_bp>0));
INSERT INTO patients VALUES(…);
INSERT OR IGNORE …           -- skip dup
cur.executemany(sql, rows); con.commit();
SELECT cols FROM t LIMIT 5 OFFSET 5;
SELECT sql FROM sqlite_master;   -- schema
PRAGMA table_info(patients);

Must-know traps

  • PK = UNIQUE+NOT NULL+stable; INTEGER PK = rowid alias
  • = NULL → 0 rows; ใช้ IS NULL
  • LIMIT ไม่มี ORDER BY → ลำดับไม่การันตี
  • SQLite types: TEXT/INTEGER/REAL/NUMERIC/BLOB
  • วันที่ = TEXT ISO8601 'YYYY-MM-DD'
  • ลืม commit() = ข้อมูลหาย
📄 Full cheat: wk05 slide 16

06 · Recap Week 6 — Query Toolbox

WHERE gender='หญิง' AND hba1c>7
WHERE NOT(gender='หญิง')
SELECT COUNT(*) n, AVG(hba1c), MIN… MAX…
COUNT(DISTINCT gender)
ORDER BY hba1c DESC, hn ASC
hn LIKE 'HN-54%'   birth LIKE '____-02-__'
gender IN ('ชาย','หญิง')
hba1c BETWEEN 6.5 AND 7.0
strftime('%Y',birth_date) AS y
CAST((julianday('now')-julianday(d))/365.25 AS INT) age

Pipeline (จำ!)

FROM → WHERE → SELECT → ORDER BY → LIMIT
  • alias ใช้ใน ORDER BY ✓ / WHERE ✗
  • NOT IN (+NULL in list) → 0 rows
  • BETWEEN รวมขอบทั้งสอง
  • aggregate ข้าม NULL (COALESCE ถ้าต้องการ 0)
📄 Full cheat: wk06 slide 16

07 · Recap Week 7 — Joins & Aggregation

PRAGMA foreign_keys = ON   -- per connection!
REFERENCES patients(patient_id)

INNER JOIN r ON r.pid=p.pid   -- match only
LEFT  JOIN …                  -- left full
LEFT … WHERE r.rx_id IS NULL  -- anti-join
RIGHT/FULL OUTER              -- SQLite≥3.39
SELF: referrals a JOIN patients pa… pb…
q1 UNION q2                   -- dedupe stack

GROUP BY drug
HAVING COUNT(*) > 1
-- non-aggregate ⇒ ต้องอยู่ใน GROUP BY

Pipeline 8 ขั้น

FROM → JOIN → WHERE → GROUP BYHAVING → SELECT → ORDER BY → LIMIT
  • dot notation p.col/r.col — กัน ambiguous
  • anti-join = หา "ไม่มี" (missed follow-up)
  • UNION dedupe / UNION ALL เร็วกว่า
📄 Full cheat: wk07 slide 14

08 · วิธีคิดทำข้อสอบ SQL แบบมีระบบ

1️⃣ อ่านโจทย์ → output columns อะไร?
2️⃣ ตารางไหนมี columns เหล่านั้น? → FROM/JOIN
3️⃣ กรองแถว? → WHERE
4️⃣ คำว่า "แต่ละ/รายกลุ่ม"? → GROUP BY
5️⃣ เงื่อนไขหลัง aggregate? → HAVING
6️⃣ เรียง/ตัด? → ORDER BY/LIMIT
✍️ เขียน query → รัน → นับ rows sanity-check

ตัวอย่างจริง

"แสดง 3 คลินิกที่จ่ายยา Metformin เฉลี่ยราคาสูงสุด"

  1. output: clinic, avg_price → SELECT
  2. rx table → FROM prescriptions
  3. Metformin only → WHERE drug='Metformin'
  4. "แต่ละคลินิก" → GROUP BY practice_code
  5. sport สูงสุด 3 → ORDER BY DESC LIMIT 3
⏱️ ติดขัด > 5 นาที → ข้ามไปข้ออื่นก่อน แล้ววนกลับ

09 · Mock Exam Lab 🧪 — ลองก่อนจริง

เปิด week09-midterm-review.ipynb ด้วย uv run jupyter lab

  • Part A (10×3): เขียน SQL 10 ข้อ ครอบคลุม COUNT/WHERE-NULL/agg/DISTINCT/LIKE/date/JOIN/GROUP/HAVING
  • Part B (2×10): pandas clean pipeline + groupby เทียบ SQL
  • Part C: concept Q&A (NULL logic, joins, WHERE vs HAVING, DW/Lake, HIPAA tie-in)
  • 🔑 ทุกข้อมี เฉลยซ่อนใน details tag — พยายามก่อน แล้วค่อยเปิด!
ทำครบ ≤ 90 นาที = พร้อมสอบจริง 💪

10 · Checklist ก่อนเข้าห้องสอบ

🎒 ของที่ต้องมี

  • โฟลเดอร์โปรเจกต์ที่รันได้: uv run jupyter lab ผ่านแน่นอน
  • healthinfo.db (patients + prescriptions)
  • สำเนา notebooks wk05–07 (offline reference ถ้าอนุญาต)
  • Printed cheat sheets wk05–07 (ตามที่ประกาศอนุญาต)
  • PowerShell พร้อม scoop/uv ทดสอบก่อนวันสอบ!

🧘 ระหว่างสอบ

  • อ่านทุกข้อก่อน — เริ่มจากข้อที่ชัวร์
  • SQL: รัน sanity check (COUNT/LIMIT 5) ทุก query
  • = NULL trap, วงเล็บ boolean, dot notation
  • เหลือเวลา 10 นาทีสุดท้าย = ตรวจ commit/close + save file
⚠️ อย่าสร้าง DB ใหม่ทับของเดิมกลางสอบ — backup healthinfo.db ไว้ก่อนเข้าห้อง

11 · หลัง Midterm — ครึ่งหลังของคอร์ส

Wk10 Ethics
PDPA · HIPAA · PII audit
wk10.html
Wk11 Standards
FHIR · OMOP · ICD-10
wk11.html
Wk12 Big Data I
BigQuery/DuckDB + PySynthea
wk12.html
Wk13 Big Data II
OMOP insights
wk13.html
Wk14 Techniques
chunking · parquet · permissions
wk14.html
Wk15–16 Project
ERD สปสช. + Presentation

โชคดีกับการสอบนะครับ! 🍀