148 lines
4.9 KiB
SQL
148 lines
4.9 KiB
SQL
-- 创建学生最新健康数据视图
|
||
-- 如果视图已存在则先删除
|
||
DROP VIEW IF EXISTS public.v_latest_student_health;
|
||
|
||
-- 创建视图:获取每个学生的最新健康数据
|
||
CREATE OR REPLACE VIEW public.v_latest_student_health AS
|
||
WITH latest_measurements AS (
|
||
-- 获取每个用户每种传感器类型的最新记录
|
||
SELECT
|
||
user_id,
|
||
sensor_type,
|
||
timestamp_utc,
|
||
value_numeric,
|
||
ROW_NUMBER() OVER (
|
||
PARTITION BY user_id, sensor_type
|
||
ORDER BY timestamp_utc DESC
|
||
) as rn
|
||
FROM public.ss_sensor_measurements
|
||
WHERE value_numeric IS NOT NULL
|
||
),
|
||
pivoted_data AS (
|
||
-- 将不同传感器类型的数据透视为列
|
||
SELECT
|
||
user_id,
|
||
MAX(CASE WHEN sensor_type = 'temperature' AND rn = 1 THEN value_numeric END) as temperature_c,
|
||
MAX(CASE WHEN sensor_type = 'temperature' AND rn = 1 THEN timestamp_utc END) as temp_time,
|
||
MAX(CASE WHEN sensor_type = 'heart_rate' AND rn = 1 THEN value_numeric END) as heart_rate_bpm,
|
||
MAX(CASE WHEN sensor_type = 'heart_rate' AND rn = 1 THEN timestamp_utc END) as heart_time,
|
||
MAX(CASE WHEN sensor_type = 'spo2' AND rn = 1 THEN value_numeric END) as spo2_percent,
|
||
MAX(CASE WHEN sensor_type = 'spo2' AND rn = 1 THEN timestamp_utc END) as spo2_time,
|
||
MAX(CASE WHEN sensor_type = 'steps' AND rn = 1 THEN value_numeric END) as step_count,
|
||
MAX(CASE WHEN sensor_type = 'steps' AND rn = 1 THEN timestamp_utc END) as steps_time
|
||
FROM latest_measurements
|
||
GROUP BY user_id
|
||
)
|
||
-- 关联用户基本信息
|
||
SELECT
|
||
u.id as user_id,
|
||
u.username as name,
|
||
u.email as student_id, -- 临时使用email作为student_id,您可以根据实际情况调整
|
||
u.avatar_url as avatar,
|
||
pd.temperature_c,
|
||
pd.temp_time,
|
||
pd.heart_rate_bpm,
|
||
pd.heart_time,
|
||
pd.spo2_percent,
|
||
pd.spo2_time,
|
||
pd.step_count,
|
||
pd.steps_time
|
||
FROM public.ak_users u
|
||
LEFT JOIN pivoted_data pd ON u.id = pd.user_id
|
||
WHERE u.role = 'student';
|
||
|
||
-- 给视图添加注释
|
||
COMMENT ON VIEW public.v_latest_student_health IS '学生最新健康数据视图 - 包含每个学生的最新体温、心率、血氧、步数等数据';
|
||
|
||
-- 如果ss_sensor_measurements表不存在,创建替代方案
|
||
-- 使用专门的传感器数据表
|
||
CREATE OR REPLACE VIEW public.v_latest_student_health_alt AS
|
||
WITH latest_health_data AS (
|
||
SELECT
|
||
user_id,
|
||
'temperature' as data_type,
|
||
temperature_celsius as value,
|
||
recorded_at as recorded_time
|
||
FROM public.ss_temperature
|
||
WHERE user_id IS NOT NULL AND temperature_celsius IS NOT NULL
|
||
|
||
UNION ALL
|
||
|
||
SELECT
|
||
user_id,
|
||
'heart_rate' as data_type,
|
||
heart_rate_bpm as value,
|
||
recorded_at as recorded_time
|
||
FROM public.ss_heart_rate
|
||
WHERE user_id IS NOT NULL AND heart_rate_bpm IS NOT NULL
|
||
|
||
UNION ALL
|
||
|
||
SELECT
|
||
user_id,
|
||
'spo2' as data_type,
|
||
spo2_percentage as value,
|
||
recorded_at as recorded_time
|
||
FROM public.ss_spo2
|
||
WHERE user_id IS NOT NULL AND spo2_percentage IS NOT NULL
|
||
|
||
UNION ALL
|
||
|
||
SELECT
|
||
user_id,
|
||
'steps' as data_type,
|
||
step_count as value,
|
||
recorded_at as recorded_time
|
||
FROM public.ss_steps
|
||
WHERE user_id IS NOT NULL AND step_count IS NOT NULL
|
||
),
|
||
latest_by_type AS (
|
||
SELECT
|
||
user_id,
|
||
data_type,
|
||
value,
|
||
recorded_time,
|
||
ROW_NUMBER() OVER (
|
||
PARTITION BY user_id, data_type
|
||
ORDER BY recorded_time DESC
|
||
) as rn
|
||
FROM latest_health_data
|
||
),
|
||
pivoted_alt AS (
|
||
SELECT
|
||
user_id,
|
||
MAX(CASE WHEN data_type = 'temperature' AND rn = 1 THEN value END) as temperature_c,
|
||
MAX(CASE WHEN data_type = 'temperature' AND rn = 1 THEN recorded_time END) as temp_time,
|
||
MAX(CASE WHEN data_type = 'heart_rate' AND rn = 1 THEN value END) as heart_rate_bpm,
|
||
MAX(CASE WHEN data_type = 'heart_rate' AND rn = 1 THEN recorded_time END) as heart_time,
|
||
MAX(CASE WHEN data_type = 'spo2' AND rn = 1 THEN value END) as spo2_percent,
|
||
MAX(CASE WHEN data_type = 'spo2' AND rn = 1 THEN recorded_time END) as spo2_time,
|
||
MAX(CASE WHEN data_type = 'steps' AND rn = 1 THEN value END) as step_count,
|
||
MAX(CASE WHEN data_type = 'steps' AND rn = 1 THEN recorded_time END) as steps_time
|
||
FROM latest_by_type
|
||
GROUP BY user_id
|
||
)
|
||
SELECT
|
||
u.id as user_id,
|
||
u.username as name,
|
||
u.email as student_id,
|
||
u.avatar_url as avatar,
|
||
pa.temperature_c,
|
||
pa.temp_time,
|
||
pa.heart_rate_bpm,
|
||
pa.heart_time,
|
||
pa.spo2_percent,
|
||
pa.spo2_time,
|
||
pa.step_count,
|
||
pa.steps_time
|
||
FROM public.ak_users u
|
||
LEFT JOIN pivoted_alt pa ON u.id = pa.user_id
|
||
WHERE u.role = 'student';
|
||
|
||
-- 查看当前系统中存在哪些传感器相关的表
|
||
SELECT table_name
|
||
FROM information_schema.tables
|
||
WHERE table_schema = 'public'
|
||
AND (table_name LIKE '%sensor%' OR table_name LIKE '%ss_%')
|
||
ORDER BY table_name;
|