为何这段代码会复制每一行,导致结果增加呢:select distinct s_name,student.s_id,avg(s_score) over(partition by s_name) avgscore from student left join score on student.s_id=score.s_id
时间: 2024-04-17 17:26:45 浏览: 104
这段代码中的结果行数增加的原因是使用了窗口函数(Window Function)`avg(s_score) over(partition by s_name)`。窗口函数在每一行上执行聚合操作并生成结果,而不是简单地对整个查询结果进行聚合。
在你的代码中,`avg(s_score) over(partition by s_name)`会为每个不同的`s_name`值计算平均分数,并将该平均分数复制到相应的每一行中。这就是为什么结果集中可能会出现重复行的原因。
如果你只想得到每个不同`s_name`值对应的平均分数,而不需要复制到每一行,你可以使用子查询来实现,如下所示:
```sql
SELECT s_name, student.s_id, avgscore
FROM (
SELECT s_name, AVG(s_score) AS avgscore
FROM student
LEFT JOIN score ON student.s_id = score.s_id
GROUP BY s_name
) AS subquery
LEFT JOIN student ON subquery.s_name = student.s_name
```
这样可以确保结果集中每个不同的`s_name`值只有一行,并且包含了对应的平均分数。
相关问题
问题:给定两张表(学生课程成绩表,学生班级表),写出如下两个sql 学生课程成绩表:table_course_grade,包含字段:course_id course_name student_id student_name course_grade 学生班级表: table_class_student,包含字段:class_id class_name student_id student_name 1、写出sql,"计算学生数量,这些同学的总分大于150分,平均分小于90分"。 2、写出hivesql并解释,"列出各个班级的名称和总分值"。
答案:
1、计算学生数量,这些同学的总分大于150分,平均分小于90分的SQL语句:
```sql
SELECT COUNT(DISTINCT student_id)
FROM table_course_grade
GROUP BY student_id
HAVING SUM(course_grade) > 150 AND AVG(course_grade) < 90;
```
2、列出各个班级的名称和总分值的HiveSQL语句:
```sql
SELECT c.class_name, SUM(g.course_grade) as total_grade
FROM table_class_student c
JOIN table_course_grade g
ON c.student_id = g.student_id
GROUP BY c.class_name;
```
该语句使用了INNER JOIN将两个表连接起来,在GROUP BY语句中按照班级名称进行分组,并使用SUM函数计算每个班级的总分。最后,SELECT语句选择班级名称和总分作为输出结果。
写出HiveQL并解释下列问题:给定两张表(学生课程成绩表,学生班级表),写出如下两个sql 学生课程成绩表:table_course_grade,包含字段:course_id course_name student_id student_name course_grade 学生班级表: table_class_student,包含字段:class_id class_name student_id student_name 1、写出sql,"计算学生数量,这些同学的总分大于150分,平均分小于90分"。 2、写出sql,"列出各个班级的名称和总分值"。
答案:
1、计算学生数量,这些同学的总分大于150分,平均分小于90分的HiveQL语句:
```sql
SELECT COUNT(DISTINCT c.student_id)
FROM table_course_grade g
JOIN table_class_student c
ON g.student_id = c.student_id
GROUP BY c.student_id
HAVING SUM(g.course_grade) > 150 AND AVG(g.course_grade) < 90;
```
该语句使用了INNER JOIN将两个表连接起来,在GROUP BY语句中按照学生ID进行分组,并使用SUM函数计算每个学生的总分,使用AVG函数计算每个学生的平均分。最后,HAVING子句筛选出总分大于150分,平均分小于90分的学生,并使用COUNT函数计算这些学生的数量。
2、列出各个班级的名称和总分值的HiveQL语句:
```sql
SELECT c.class_name, SUM(g.course_grade) as total_grade
FROM table_course_grade g
JOIN table_class_student c
ON g.student_id = c.student_id
GROUP BY c.class_name;
```
该语句使用了INNER JOIN将两个表连接起来,在GROUP BY语句中按照班级名称进行分组,并使用SUM函数计算每个班级的总分。最后,SELECT语句选择班级名称和总分作为输出结果。
阅读全文