简单的健康数据筛查: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上的几个方案还没有弄好...(感觉看了好久这个问题了...那就先这样...再慢慢学习...
原文链接推荐一篇文章,分享一首最近单曲循环的新歌,过几天想聊一下每年都关注的金曲奖