-- 学生健康数据展示用的简化传感器数据表 -- 为了简化演示,我们创建一个统一的传感器数据表 -- 创建简化的传感器数据表 CREATE TABLE IF NOT EXISTS public.ss_sensor_data ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), user_id UUID NOT NULL REFERENCES public.ak_users(id) ON DELETE CASCADE, sensor_type TEXT NOT NULL, -- 'temperature', 'heart_rate', 'oxygen_level', 'steps' value NUMERIC NOT NULL, unit TEXT, -- '°C', 'bpm', '%', 'steps' recorded_at TIMESTAMPTZ NOT NULL DEFAULT now(), created_at TIMESTAMPTZ NOT NULL DEFAULT now() ); -- 创建索引以提高查询性能 CREATE INDEX IF NOT EXISTS idx_ss_sensor_data_user_type_time ON public.ss_sensor_data(user_id, sensor_type, recorded_at DESC); CREATE INDEX IF NOT EXISTS idx_ss_sensor_data_type_time ON public.ss_sensor_data(sensor_type, recorded_at DESC); -- 插入示例数据(为演示用) -- 假设有一个学生用户ID DO $$ DECLARE demo_user_id UUID; current_time TIMESTAMPTZ; BEGIN -- 查找第一个学生用户ID SELECT id INTO demo_user_id FROM public.ak_users WHERE role = 'student' LIMIT 1; -- 如果找到学生用户,插入示例数据 IF demo_user_id IS NOT NULL THEN current_time := NOW(); -- 插入体温数据(最近7天,每小时一条) INSERT INTO public.ss_sensor_data (user_id, sensor_type, value, unit, recorded_at) SELECT demo_user_id, 'temperature', 36.0 + (random() * 1.5), -- 36.0-37.5°C '°C', current_time - (interval '1 hour' * generate_series(0, 167)) FROM generate_series(0, 167) AS gs; -- 插入心率数据(最近7天,每30分钟一条) INSERT INTO public.ss_sensor_data (user_id, sensor_type, value, unit, recorded_at) SELECT demo_user_id, 'heart_rate', 60 + (random() * 40), -- 60-100 bpm 'bpm', current_time - (interval '30 minutes' * generate_series(0, 335)) FROM generate_series(0, 335) AS gs; -- 插入血氧数据(最近7天,每2小时一条) INSERT INTO public.ss_sensor_data (user_id, sensor_type, value, unit, recorded_at) SELECT demo_user_id, 'oxygen_level', 95 + (random() * 5), -- 95-100% '%', current_time - (interval '2 hours' * generate_series(0, 83)) FROM generate_series(0, 83) AS gs; -- 插入步数数据(最近7天,每天一条) INSERT INTO public.ss_sensor_data (user_id, sensor_type, value, unit, recorded_at) SELECT demo_user_id, 'steps', 5000 + (random() * 10000), -- 5000-15000 steps 'steps', current_time - (interval '1 day' * generate_series(0, 6)) FROM generate_series(0, 6) AS gs; RAISE NOTICE '成功为用户 % 插入示例传感器数据', demo_user_id; ELSE RAISE NOTICE '未找到学生用户,跳过示例数据插入'; END IF; END $$; -- 创建视图以便查询最新的传感器数据 CREATE OR REPLACE VIEW public.v_latest_sensor_data AS WITH latest_readings AS ( SELECT user_id, sensor_type, value, unit, recorded_at, ROW_NUMBER() OVER (PARTITION BY user_id, sensor_type ORDER BY recorded_at DESC) as rn FROM public.ss_sensor_data ) SELECT user_id, sensor_type, value, unit, recorded_at FROM latest_readings WHERE rn = 1; -- 授予权限 GRANT SELECT ON public.ss_sensor_data TO authenticated; GRANT SELECT ON public.v_latest_sensor_data TO authenticated; COMMENT ON TABLE public.ss_sensor_data IS '简化的传感器数据表,用于存储学生的健康监测数据'; COMMENT ON VIEW public.v_latest_sensor_data IS '获取每个用户每种传感器类型的最新数据';