Tag Archive Class Interval

Byphunsanit

การสร้าง Table อ้างอิง (Reference Table), ตารางอันตรภาคชั้น (Class Interval) แบบที่ 2

จากการเก็บตาราง config ในแบบ คณิตศาสตร์: อันตรภาคชั้น (Class Interval) จะยกตัวเองการออกแบบตารางอันตรภาคชั้นแบบที่สองและเทียบข้อแตกต่าง

2 การสร้าง Table อ้างอิง (Reference Table), ตารางอันตรภาคชั้น (Class Interval)

เพื่อให้ระบบรองรับการเปลี่ยนแปลงของทฤษฎีในอนาคต การเก็บเกณฑ์ไว้ใน Table จะดีกว่าการ Hard-code ไว้ใน SQL ครับ

brain_development_stages

stage_idstage_namemin_agemax_agekey_characteristic
1Childhood08Rapid Growth (3y focus)
2Adolescence (Restructuring)931High Neuroplasticity / Emotional focus
3Golden Age (Adult)3265Peak Stability & Efficiency
4Early Senior6682Gradual Decline
5Late Senior83150Significant Connection Loss

วิธีใช้ Common Table Expression (CTE)

วิธีนี้เหมาะสำหรับกรณีที่คุณมีตาราง Users อยู่แล้ว และต้องการดึงข้อมูลออกมาจัดกลุ่มทันทีโดยไม่ต้องสร้าง Table เพิ่ม (อย่าง brain_development_stages ) ใน Database ครับ

WITH BrainStages AS (
    SELECT 0 AS min_age, 8 AS max_age, 'Childhood' AS stage_name, 'Rapid Growth (3y focus)' AS key_characteristic
    UNION ALL SELECT 9, 31, 'Adolescence (Restructuring)', 'High Neuroplasticity / Emotional focus'
    UNION ALL SELECT 32, 65, 'Golden Age (Adult)', 'Peak Stability & Efficiency'
    UNION ALL SELECT 66, 82, 'Early Senior', 'Gradual Decline'
    UNION ALL SELECT 83, 150, 'Late Senior', 'Significant Connection Loss'
)
SELECT 
    u.name,
    u.age,
    s.stage_name,
    s.key_characteristic
FROM Users u
LEFT JOIN BrainStages s ON u.age BETWEEN s.min_age AND s.max_age;

วิธีใช้ Subquery (กรณีต้องการสรุปจำนวนคนในแต่ละช่วง)

หากคุณต้องการทำ Report เพื่อดูว่าในบริษัทหรือในระบบของคุณ มีคนอยู่ในช่วงสมองแบบไหนจำนวนเท่าไหร่ และแยก 2 column

SELECT 
    stage_name,
    key_characteristic,
    COUNT(*) AS total_people
FROM (
    SELECT 
        CASE 
            WHEN age <= 8 THEN 'Childhood'
            WHEN age <= 31 THEN 'Adolescence (Restructuring)'
            WHEN age <= 65 THEN 'Golden Age (Adult)'
            WHEN age <= 82 THEN 'Early Senior'
            ELSE 'Late Senior'
        END AS stage_name,
        CASE 
            WHEN age <= 8 THEN 'Rapid Growth (3y focus)'
            WHEN age <= 31 THEN 'High Neuroplasticity / Emotional focus'
            WHEN age <= 65 THEN 'Peak Stability & Efficiency'
            WHEN age <= 82 THEN 'Gradual Decline'
            ELSE 'Significant Connection Loss'
        END AS key_characteristic
    FROM Users
) AS Sub
GROUP BY stage_name, key_characteristic
ORDER BY MIN(age); -- เรียงตามลำดับช่วงอายุ

จะสังเกตว่า

  • การใช้ BETWEEN vs Comparison: ในทางกฎหมายหรือวิทยาศาสตร์ที่มีจุดตัดชัดเจน (9, 32, 66) การใช้ >= และ <= จะช่วยให้อุดรอยรั่วของข้อมูลได้ดีกว่าครับ
  • Performance: หากตาราง Users มีขนาดใหญ่ (หลักแสน/ล้านแถว) การใช้ CASE WHEN ใน SELECT จะเร็วกว่าการ JOIN กับตารางเงื่อนไขเล็กๆ ครับ
  • ความแม่นยำ: อย่าลืมว่าอายุสมองที่ระบุ (9, 32, 66, 83) คือ จุดเปลี่ยน (Turning Point) ดังนั้นใน Code ผมจึงตั้งให้จุดเริ่มต้นของกลุ่มถัดไปคือตัวเลขนั้นพอดีครับ

การป้องกันความผิดพลาด

  1. ถ้าทำตารางแบบที่ 2
    1. ควรใช้ Unique Constraint, UQ ให้ตารางที่มี 2 ช่วงเพื่อป้องกันอายุที่ซ้ำกัน (min_age, max_age}
    2. ควรมี validation ที่เช็คว่าข้อมูล max_age แถว n จะต้องต่อเนื่องกับ min_age n+1 ไม่ไม่ซ้อนทับกัน เช่น + 0.0000001
  2. ข้อมูลไม่ควรการขาดช่วง เพราะจะไม่มีลัพท์ออกมา
    • อาจจะใช้ else return error ออกมาไห้รู้
  3. รายงาน
    • การทำรายงานออกมา ควรต้องเรียงลำดับผลลัพธ์จากตัวชี้วัดจากน้อยไปมาก
    • ข้อดีของตารางแบบที่ 2 ที่มีช่วงต่อเนื้อให้ดูคือ
      • มันทำ report ง่าย เอามาแสดงได้ทันที
      • ดูใน database ตาเปล่าก็จะเห็นเหมือนในตารางจริง ๆ เห็นชัดเจนในความต่อเนื่อง

อ่านเพิ่มเติม