sql - 在 Postgresql 中的两个表上使用横向
问题描述
大家好,
我需要一点帮助来弄清楚如何lateral
在 Postgresql 中跨两个表使用。我有两个表,student
和course
,以及一个函数student_course_assessment_info_by_course(student_id, course_id): course_assessment_info
,它获取学生记录的 ID 和课程记录的 ID,并获取该学生的一些成绩信息,例如他们的平均成绩。我想使用这个函数来创建另一个函数,它会为所有在课程最低 gpa 分数范围内的学生students_near_gpa_minimum
获取一个表格。student_id,course_id,gpa,minimum_gpa
到目前为止,我知道我应该能够使用该lateral
程序在学生表上“每行”运行课程评估功能,但我很难弄清楚如何准确地做到这一点,因为评估功能需要学生 id 和课程编号。我在下面的函数抱怨课程列不存在——这是真的。我还需要迭代可用的课程。
select * from
(select * from ontrack.student) students,
lateral (select * from ontrack.student_course_assessment_info_by_course(students."id", "2b0df865-d7c6-4c96-9f10-992cd409dedb")) grades;
我知道这可以通过查询所有数据然后用 C++ 之类的语言计算结果来相当容易地解决,但我正在尝试正确处理 SQL,我觉得如果我了解如何执行这种操作这将是非常有益的。再说一次,也许这真的是应该在 sql 之外完成的事情。
任何帮助表示赞赏,谢谢!
select student.id, weighted_mark_average
from student
cross join course
cross join lateral course_assessment_info_by_student_id_and_course_id(student."id", course."id");
这样可行!
解决方案
您可以使用这样的功能获得学生和课程的所有组合的成绩
select *
from student
cross join course
cross join lateral student_course_assessment_info_by_course(student."id", course."id")
然而,它是课程和学生的每一种组合。如果您只对实际有效的课程和学生的组合感兴趣(因此学生学习了该课程),那么必须有一个course_student
需要与student
and连接的表course
。
编辑
如果您对学生实际学习的课程成绩感兴趣,请运行以下命令
select s.id, c.id, sc.grade
from student s
join student_course sc on s.id = sc.student_id
join course c on c.id = sc.course_id
推荐阅读
- python - 使用 lightgbm 的特征重要性
- vue.js - Win10、VirtualBox、Ubuntu、Vue-cli 3 - 观看不工作
- jquery - 使用淡入淡出显示/隐藏内容
- python - 大型 WGAN-GP 训练损失
- javascript - AngularJS | 检查箭头和用户输入的最大和最小输入值
- c# - 防止外部对象调用聚合内实体上的方法
- sql - 不能在用于 GROUP BY 的 group by 列表的表达式中使用聚合或子查询
- dns - 使用 aws cli 在 lightsail 条目中创建 DNS
- splunk - 运行脚本操作的 Splunk 警报
- javascript - 为什么我不能迭代类原型?