จากการเก็บตาราง 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 ตาเปล่าก็จะเห็นเหมือนในตารางจริง ๆ เห็นชัดเจนในความต่อเนื่อง
อ่านเพิ่มเติม
