จากการเก็บตาราง config ในแบบ คณิตศาสตร์: อันตรภาคชั้น (Class Interval) จะยกตัวเองการออกแบบตารางอันตรภาคชั้นแบบที่สองและเทียบข้อแตกต่าง
2 การสร้าง Table อ้างอิง (Reference Table) , ตารางอันตรภาคชั้น (Class Interval)
เพื่อให้ระบบรองรับการเปลี่ยนแปลงของทฤษฎีในอนาคต การเก็บเกณฑ์ไว้ใน Table จะดีกว่าการ Hard-code ไว้ใน SQL ครับ
brain_development_stages
| stage_id | stage_name | min_age | max_age | key_characteristic |
| 1 | Childhood | 0 | 8 | Rapid Growth (3y focus) |
| 2 | Adolescence (Restructuring) | 9 | 31 | High Neuroplasticity / Emotional focus |
| 3 | Golden Age (Adult) | 32 | 65 | Peak Stability & Efficiency |
| 4 | Early Senior | 66 | 82 | Gradual Decline |
| 5 | Late Senior | 83 | 150 | Significant 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) ; -- เรียงตามลำดับช่วงอายุ
จะสังเกตว่า
- การใช้
BETWEENvsComparison: ในทางกฎหมายหรือวิทยาศาสตร์ที่มีจุดตัดชัดเจน (9, 32, 66) การใช้>=และ<=จะช่วยให้อุดรอยรั่วของข้อมูลได้ดีกว่าครับ - Performance: หากตาราง
Usersมีขนาดใหญ่ (หลักแสน / ล้านแถว) การใช้CASE WHENในSELECTจะเร็วกว่าการJOINกับตารางเงื่อนไขเล็ก ๆ ครับ - ความแม่นยำ: อย่าลืมว่าอายุสมองที่ระบุ (9, 32, 66, 83) คือ จุดเปลี่ยน (Turning Point) ดังนั้นใน Code ผมจึงตั้งให้จุดเริ่มต้นของกลุ่มถัดไปคือตัวเลขนั้นพอดีครับ
การป้องกันความผิดพลาด
- ถ้าทำตารางแบบที่ 2
- ควรใช้ Unique Constraint, UQ ให้ตารางที่มี 2 ช่วงเพื่อป้องกันอายุที่ซ้ำกัน (min_age, max_age)
- ควรมี validation ที่เช็คว่าข้อมูล max_age แถว n จะต้องต่อเนื่องกับ min_age n+1 ไม่ไม่ซ้อนทับกัน เช่น + 0.0000001
- ข้อมูลไม่ควรการขาดช่วง เพราะจะไม่มีลัพท์ออกมา
- อาจจะใช้ else return error ออกมาไห้รู้
- รายงาน
- การทำรายงานออกมา ควรต้องเรียงลำดับผลลัพธ์จากตัวชี้วัดจากน้อยไปมาก
- ข้อดีของตารางแบบที่ 2 ที่มีช่วงต่อเนื้อให้ดูคือ
- มันทำ report ง่าย เอามาแสดงได้ทันที
- ดูใน database ตาเปล่าก็จะเห็นเหมือนในตารางจริง ๆ เห็นชัดเจนในความต่อเนื่อง
อ่านเพิ่มเติม