249 lines
9.0 KiB
SQL
249 lines
9.0 KiB
SQL
-- 为学生健康监测系统生成测试数据
|
||
-- 这个脚本将创建测试的教师、班级、学生和健康数据
|
||
|
||
-- 1. 创建测试班级
|
||
INSERT INTO ak_classes (id, name, description, created_at) VALUES
|
||
('class_001', '计算机科学1班', '计算机科学专业一年级1班', NOW()),
|
||
('class_002', '软件工程1班', '软件工程专业一年级1班', NOW()),
|
||
('class_003', '信息管理1班', '信息管理专业一年级1班', NOW())
|
||
ON CONFLICT (id) DO NOTHING;
|
||
|
||
-- 2. 创建测试教师
|
||
INSERT INTO ak_users (id, name, email, role, avatar, class_id, student_id, created_at) VALUES
|
||
('teacher_001', '张老师', 'zhang@school.com', 'teacher', 'https://via.placeholder.com/100x100?text=张', NULL, NULL, NOW())
|
||
ON CONFLICT (id) DO NOTHING;
|
||
|
||
-- 3. 设置教师负责的班级
|
||
INSERT INTO ak_teacher_roles (user_id, class_id, created_at) VALUES
|
||
('teacher_001', 'class_001', NOW()),
|
||
('teacher_001', 'class_002', NOW())
|
||
ON CONFLICT (user_id, class_id) DO NOTHING;
|
||
|
||
-- 4. 创建测试学生
|
||
INSERT INTO ak_users (id, name, email, role, avatar, class_id, student_id, created_at) VALUES
|
||
-- 计算机科学1班学生
|
||
('student_001', '王小明', 'wang@student.com', 'student', 'https://via.placeholder.com/100x100?text=王', 'class_001', '2024001', NOW()),
|
||
('student_002', '李小红', 'li@student.com', 'student', NULL, 'class_001', '2024002', NOW()),
|
||
('student_003', '张小华', 'zhang@student.com', 'student', 'https://via.placeholder.com/100x100?text=张', 'class_001', '2024003', NOW()),
|
||
('student_004', '刘小刚', 'liu@student.com', 'student', NULL, 'class_001', '2024004', NOW()),
|
||
|
||
-- 软件工程1班学生
|
||
('student_005', '陈小美', 'chen@student.com', 'student', 'https://via.placeholder.com/100x100?text=陈', 'class_002', '2024005', NOW()),
|
||
('student_006', '赵小强', 'zhao@student.com', 'student', NULL, 'class_002', '2024006', NOW()),
|
||
('student_007', '孙小丽', 'sun@student.com', 'student', 'https://via.placeholder.com/100x100?text=孙', 'class_002', '2024007', NOW()),
|
||
|
||
-- 信息管理1班学生(不属于张老师管理)
|
||
('student_008', '吴小亮', 'wu@student.com', 'student', NULL, 'class_003', '2024008', NOW()),
|
||
('student_009', '马小静', 'ma@student.com', 'student', 'https://via.placeholder.com/100x100?text=马', 'class_003', '2024009', NOW())
|
||
ON CONFLICT (id) DO NOTHING;
|
||
|
||
-- 5. 生成传感器主记录
|
||
INSERT INTO ss_sensor_measurements (id, user_id, device_id, measurement_time, created_at) VALUES
|
||
-- 最近的数据(1小时内)
|
||
('measurement_001', 'student_001', 'device_001', NOW() - INTERVAL '30 minutes', NOW()),
|
||
('measurement_002', 'student_002', 'device_002', NOW() - INTERVAL '45 minutes', NOW()),
|
||
('measurement_003', 'student_003', 'device_003', NOW() - INTERVAL '20 minutes', NOW()),
|
||
('measurement_004', 'student_004', 'device_004', NOW() - INTERVAL '15 minutes', NOW()),
|
||
('measurement_005', 'student_005', 'device_005', NOW() - INTERVAL '25 minutes', NOW()),
|
||
('measurement_006', 'student_006', 'device_006', NOW() - INTERVAL '35 minutes', NOW()),
|
||
('measurement_007', 'student_007', 'device_007', NOW() - INTERVAL '40 minutes', NOW()),
|
||
|
||
-- 较早的数据(1天前)
|
||
('measurement_101', 'student_001', 'device_001', NOW() - INTERVAL '1 day', NOW()),
|
||
('measurement_102', 'student_002', 'device_002', NOW() - INTERVAL '1 day', NOW()),
|
||
('measurement_103', 'student_003', 'device_003', NOW() - INTERVAL '1 day', NOW())
|
||
ON CONFLICT (id) DO NOTHING;
|
||
|
||
-- 6. 生成体温数据
|
||
INSERT INTO ss_temperature (measurement_id, temperature_c, created_at) VALUES
|
||
-- 正常体温
|
||
('measurement_001', 36.5, NOW()),
|
||
('measurement_003', 36.8, NOW()),
|
||
('measurement_005', 36.3, NOW()),
|
||
('measurement_007', 36.6, NOW()),
|
||
|
||
-- 异常体温(发烧)
|
||
('measurement_002', 38.2, NOW()), -- 李小红发烧
|
||
('measurement_004', 37.8, NOW()), -- 刘小刚体温偏高
|
||
('measurement_006', 35.5, NOW()), -- 赵小强体温偏低
|
||
|
||
-- 历史数据
|
||
('measurement_101', 36.4, NOW()),
|
||
('measurement_102', 36.7, NOW()),
|
||
('measurement_103', 36.5, NOW())
|
||
ON CONFLICT (measurement_id) DO NOTHING;
|
||
|
||
-- 7. 生成心率数据
|
||
INSERT INTO ss_heart_rate (measurement_id, heart_rate_bpm, created_at) VALUES
|
||
-- 正常心率
|
||
('measurement_001', 75, NOW()),
|
||
('measurement_003', 82, NOW()),
|
||
('measurement_005', 68, NOW()),
|
||
|
||
-- 异常心率
|
||
('measurement_002', 110, NOW()), -- 李小红心率过快(配合发烧)
|
||
('measurement_004', 95, NOW()), -- 刘小刚心率偏快
|
||
('measurement_006', 45, NOW()), -- 赵小强心率过慢
|
||
('measurement_007', 105, NOW()), -- 孙小丽心率偏快
|
||
|
||
-- 历史数据
|
||
('measurement_101', 78, NOW()),
|
||
('measurement_102', 72, NOW()),
|
||
('measurement_103', 80, NOW())
|
||
ON CONFLICT (measurement_id) DO NOTHING;
|
||
|
||
-- 8. 生成血氧数据
|
||
INSERT INTO ss_spo2 (measurement_id, spo2_percent, created_at) VALUES
|
||
-- 正常血氧
|
||
('measurement_001', 98, NOW()),
|
||
('measurement_003', 97, NOW()),
|
||
('measurement_005', 99, NOW()),
|
||
('measurement_007', 96, NOW()),
|
||
|
||
-- 异常血氧
|
||
('measurement_002', 93, NOW()), -- 李小红血氧偏低(配合发烧)
|
||
('measurement_004', 94, NOW()), -- 刘小刚血氧偏低
|
||
('measurement_006', 92, NOW()), -- 赵小强血氧偏低
|
||
|
||
-- 历史数据
|
||
('measurement_101', 98, NOW()),
|
||
('measurement_102', 97, NOW()),
|
||
('measurement_103', 96, NOW())
|
||
ON CONFLICT (measurement_id) DO NOTHING;
|
||
|
||
-- 9. 生成步数数据
|
||
INSERT INTO ss_steps (measurement_id, step_count, created_at) VALUES
|
||
-- 正常步数
|
||
('measurement_001', 8500, NOW()),
|
||
('measurement_002', 6200, NOW()),
|
||
('measurement_003', 9200, NOW()),
|
||
('measurement_004', 7800, NOW()),
|
||
('measurement_005', 10200, NOW()),
|
||
('measurement_006', 5500, NOW()),
|
||
('measurement_007', 8800, NOW()),
|
||
|
||
-- 历史数据
|
||
('measurement_101', 7200, NOW()),
|
||
('measurement_102', 8900, NOW()),
|
||
('measurement_103', 6800, NOW())
|
||
ON CONFLICT (measurement_id) DO NOTHING;
|
||
|
||
-- 10. 创建或更新健康数据视图
|
||
CREATE OR REPLACE VIEW v_latest_student_health AS
|
||
WITH latest_measurements AS (
|
||
SELECT
|
||
user_id,
|
||
MAX(measurement_time) as latest_time
|
||
FROM ss_sensor_measurements
|
||
WHERE user_id IN (
|
||
SELECT id FROM ak_users WHERE role = 'student'
|
||
)
|
||
GROUP BY user_id
|
||
),
|
||
student_health_data AS (
|
||
SELECT
|
||
u.id as user_id,
|
||
u.name,
|
||
u.student_id,
|
||
u.avatar,
|
||
u.class_id,
|
||
sm.measurement_time,
|
||
sm.id as measurement_id
|
||
FROM ak_users u
|
||
LEFT JOIN latest_measurements lm ON u.id = lm.user_id
|
||
LEFT JOIN ss_sensor_measurements sm ON u.id = sm.user_id AND sm.measurement_time = lm.latest_time
|
||
WHERE u.role = 'student'
|
||
)
|
||
SELECT
|
||
shd.user_id,
|
||
shd.name,
|
||
shd.student_id,
|
||
shd.avatar,
|
||
shd.class_id,
|
||
shd.measurement_time as latest_measurement_time,
|
||
-- 体温数据
|
||
st.temperature_c,
|
||
st.created_at as temp_time,
|
||
-- 心率数据
|
||
shr.heart_rate_bpm,
|
||
shr.created_at as heart_time,
|
||
-- 血氧数据
|
||
ssp.spo2_percent,
|
||
ssp.created_at as spo2_time,
|
||
-- 步数数据
|
||
sst.step_count,
|
||
sst.created_at as steps_time
|
||
FROM student_health_data shd
|
||
LEFT JOIN ss_temperature st ON shd.measurement_id = st.measurement_id
|
||
LEFT JOIN ss_heart_rate shr ON shd.measurement_id = shr.measurement_id
|
||
LEFT JOIN ss_spo2 ssp ON shd.measurement_id = ssp.measurement_id
|
||
LEFT JOIN ss_steps sst ON shd.measurement_id = sst.measurement_id;
|
||
|
||
-- 测试查询:验证数据是否正确生成
|
||
-- 这将显示张老师负责的学生健康数据
|
||
SELECT
|
||
vlsh.*,
|
||
-- 异常判断
|
||
CASE
|
||
WHEN temperature_c < 36.0 OR temperature_c > 37.5 THEN 'TEMP_ABNORMAL'
|
||
ELSE 'TEMP_NORMAL'
|
||
END as temp_status,
|
||
CASE
|
||
WHEN heart_rate_bpm < 60 OR heart_rate_bpm > 100 THEN 'HR_ABNORMAL'
|
||
ELSE 'HR_NORMAL'
|
||
END as hr_status,
|
||
CASE
|
||
WHEN spo2_percent < 95 THEN 'SPO2_ABNORMAL'
|
||
ELSE 'SPO2_NORMAL'
|
||
END as spo2_status
|
||
FROM v_latest_student_health vlsh
|
||
WHERE user_id IN (
|
||
SELECT u.id
|
||
FROM ak_users u
|
||
WHERE u.role = 'student'
|
||
AND u.class_id IN (
|
||
SELECT class_id
|
||
FROM ak_teacher_roles
|
||
WHERE user_id = 'teacher_001'
|
||
)
|
||
)
|
||
ORDER BY
|
||
-- 异常优先排序
|
||
CASE
|
||
WHEN (temperature_c < 36.0 OR temperature_c > 37.5 OR
|
||
heart_rate_bpm < 60 OR heart_rate_bpm > 100 OR
|
||
spo2_percent < 95)
|
||
THEN 0
|
||
ELSE 1
|
||
END,
|
||
name;
|
||
|
||
-- 显示创建的数据统计
|
||
SELECT
|
||
'教师数量' as type, COUNT(*) as count
|
||
FROM ak_users WHERE role = 'teacher'
|
||
UNION ALL
|
||
SELECT
|
||
'学生数量' as type, COUNT(*) as count
|
||
FROM ak_users WHERE role = 'student'
|
||
UNION ALL
|
||
SELECT
|
||
'张老师负责的学生' as type, COUNT(*) as count
|
||
FROM ak_users u
|
||
WHERE u.role = 'student'
|
||
AND u.class_id IN (
|
||
SELECT class_id FROM ak_teacher_roles WHERE user_id = 'teacher_001'
|
||
)
|
||
UNION ALL
|
||
SELECT
|
||
'有健康数据的学生' as type, COUNT(DISTINCT user_id) as count
|
||
FROM v_latest_student_health
|
||
WHERE temperature_c IS NOT NULL OR heart_rate_bpm IS NOT NULL OR spo2_percent IS NOT NULL
|
||
UNION ALL
|
||
SELECT
|
||
'异常健康指标的学生' as type, COUNT(*) as count
|
||
FROM v_latest_student_health
|
||
WHERE temperature_c < 36.0 OR temperature_c > 37.5 OR
|
||
heart_rate_bpm < 60 OR heart_rate_bpm > 100 OR
|
||
spo2_percent < 95;
|