返回重复列值的SQL
我想做的是:只显示唯一的课程ID,其中每个课程ID显示1名学生及其项目名称和最新的项目日志 例如:返回重复列值的SQL,sql,select,duplicates,Sql,Select,Duplicates,我想做的是:只显示唯一的课程ID,其中每个课程ID显示1名学生及其项目名称和最新的项目日志 例如: +----------+-------------+-----------------+------------------+ | CourseID | StudentName | ProjectName | LatestLog | +----------+-------------+-----------------+------------------+ | 1
+----------+-------------+-----------------+------------------+
| CourseID | StudentName | ProjectName | LatestLog |
+----------+-------------+-----------------+------------------+
| 1 | Bob | Bob's Project | 01/09/2017 09:15 |
+----------+-------------+-----------------+------------------+
| 2 | Tim | Tim's Project | 02/10/2017 13:00 |
+----------+-------------+-----------------+------------------+
| 3 | Billy | Billy's Project | 02/12/2017 12:45 |
+----------+-------------+-----------------+------------------+
以下是我的数据库表关系:
- 一门课程有很多学生。(一对多)
- 一个学生有一个学生项目。(1对1)
- 学生项目有许多项目日志。(一对多)
SELECT Course.ID, -- INT
Student.Name, -- VARCHAR(50)
StudentProjects.Name, -- VARCHAR(50)
MAX(ProjectLogs.LogDate) AS LogDate -- DATETIME
FROM ProjectLogs INNER JOIN
Student ON Student.ID = ProjectLogs.StudentID INNER JOIN
StudentProjects ON StudentProjects.ID = Student.ProjectID INNER JOIN
Course ON Course.ID = Student.CourseID
GROUP BY Course.ID, Student.Name, StudentProjects.Name
这就是您正在寻找的:
select Id as course_id,
student_name,
student_name,
project_name,
LogDate
from (
SELECT Course.ID, -- INT
Student.Name student_name, -- VARCHAR(50)
StudentProjects.Name project_name, -- VARCHAR(50)
ProjectLogs.LogDate,
row_number()over(partition by Course.ID order by ProjectLogs.LogDate desc) rn -- DATETIME
FROM ProjectLogs INNER JOIN
Student ON Student.ID = ProjectLogs.ID INNER JOIN
StudentProjects ON StudentProjects.ID = Student.ID INNER JOIN
Course ON Course.ID = Student.ID
) q
where rn = 1;
您可以使用CTE获取每个学生的最大日志日期,然后将其连接到查询的简化版本,如下所示:
;WITH MaxLogDate AS
(
SELECT StudentID
,LogDate = MAX(LogDate)
FROM ProjectLogs
GROUP BY StudentID
)
SELECT c.ID
,s.Name
,sp.Name
,m.LogDate
FROM Courses c
INNER JOIN Student s ON s.ID = c.StudentID
INNER JOIN StudentProjects sp ON sp.StudentID = s.ID
INNER JOIN MaxLogDate m ON m.StudentID = s.ID
您能提供您的表结构和一些示例数据吗?看起来您的所有表都有一个
ID
列,但根据您的查询,这只是学生的ID。此外,一个学生是否可以参加多个课程,如果是,他们是否可以为每个课程安排不同的学生项目,如果是,您的课程
表与学生项目
表的关系如何?@digital.aaron ID都是主键。不,学生不能参加多个课程,好问题。我无法提供任何示例数据,因为我用不同的名称命名了表,但逻辑与公司数据相同,抱歉。courses表与StudentProject间接相关,因为Students表用作桥接表,因为它同时具有指向courses和StudentProject主键的外键。我必须重命名将表连接在一起的ID。抱歉搞混了!问题是它重复了课程ID列。我想显示唯一的课程ID,其中其他3列表示最新提交的项目日志(以便人们可以查看)。我不想看到每个学生,只想看到下一个被审核的学生(以及他们的项目和日志日期)。我收到一条错误消息:“Course.ID”列在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。我添加了GROUP BY Course.ID,student.Name,StudentProjects.Name,ProjectLogs.LogDate
现在它可以工作了!是的,错过了。LogDate列不需要最大聚合。所以您也不需要GROUPBY子句。我编辑了答案。