vlambda博客
学习文章列表

简单的健康数据筛查:MySQL小练习

    由于一些机缘巧合,这半个多月小编在做中小学生每天的健康数据汇总......

    正好月底要去考一下MySQL,这篇写几个简单的查询语句,推荐大家了解一下“非常接近英语”的SQL(结构化查询语言)。

    不少中小学都采用了晨、午、晚两次或三次的出勤检查和体温检测。举个例子:一个小学有300位师生,开学第一天全部出勤,第二天有10个小学生因为发烧请假了,班主任需要去联系他们的家长,询问他们孩子的主要症状、每日体温、症状出现时间、目前采取的措施,是否去医院就诊,是否做过核酸检测、核酸检测结果等等一些信息。

    首先就是需要下面这样一个汇总表,样表由我们设计,只要确定好表格的格式,在指定的位置写好加减法的公式,然后用VBA或者用python的openpyxl写段代码就可以从多个excel表中提取数值并生成我们要的汇总表。

school
school1
school2
total
sort




teacher student
total number





actual attendance





number of absences





fever





cough





chest tightness





diarrhea





other





    然后就是需要一个缺勤人员名册表,收集更详细的信息,我选取了10个主要的标签,用python的faker库自动生成了一些中文名字的拼音。

CREATE TABLE `test` ( `school` varchar(50) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL, `class` varchar(50) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL, `name` varchar(50) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL, `sex` char(1) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL, `birth_year` char(4) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL, `main_symptoms` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL, `body_temperature` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL, `starting_time` date NOT NULL, `measures_taken` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL, `nucleic_acid_test` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL, `notes` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL, PRIMARY KEY (`name`) USING BTREE) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;

    然后就是写入学生的具体情况,举个例子:

INSERT INTO `test` VALUES ('Dongfang Primary School', '604', 'Fang Han', 'F', '2009', 'high fever', '39.2', '2020-09-15', 'Sent to hospital for treatment', 'Results waiting out', 'Leaving school in the morning of September 15');

    在Nacicat for MySQL里看一下

    接下来我们就写几句简单的查询语句,首先写USE db_student;

    a.发热学生的姓名、性别、年龄、主要症状和体温

select name,sex,year(now())-birth_year age main_symptoms,body_temperature from test where body_temperature>37.3;

    b.截至目前所有学校的各个班级发热学生的个数

select school,class,count(class) from test where body_temperature > 37.3 group by class;

    c.同一天内发热的学生人数

select starting_time,count(starting_time) from test where body_temperature > 37.3 group by starting_time;

    d.按照时间顺序查看所有学校的各个班级出现发热学生的情况

select school,class,starting_time from test where body_temperature > 37.3 order by starting_time asc;

    e.等待核酸结果的学生的姓名和主要症状

select name,main_symptoms,nucleic_acid_test from test where nucleic_acid_test regexp 'waiting';

    最后想写一个同一班级连续3天出现发热学生的查询语句,然后发现“查询满足条件的连续时间段”在MySQL里不太容易,有人给出了下图的一个简单的思路:“两者之和”相等即为连续的几天,但这只适用于这类情况:我有每一天的网站访问量,我想筛选出连续三天及以上访问量大于1000的日期。

    而“同一班级连续3天出现发热学生”,除了日期的连续,还需要考虑学校、班级、体温三个要素,试了csdn上的几个方案还没有弄好...(感觉看了好久这个问题了...那就先这样...再慢慢学习...

    原文链接推荐一篇文章,分享一首最近单曲循环的新歌,过几天想聊一下每年都关注的金曲奖

This browser does not support music or audio playback. Please play it in WeChat or another browser.