Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
返回重复列值的SQL_Sql_Select_Duplicates - Fatal编程技术网

返回重复列值的SQL

返回重复列值的SQL,sql,select,duplicates,Sql,Select,Duplicates,我想做的是:只显示唯一的课程ID,其中每个课程ID显示1名学生及其项目名称和最新的项目日志 例如: +----------+-------------+-----------------+------------------+ | CourseID | StudentName | ProjectName | LatestLog | +----------+-------------+-----------------+------------------+ | 1

我想做的是:只显示唯一的课程ID,其中每个课程ID显示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)
  • 学生项目有许多项目日志。(一对多)
对于每门课程,我想使用LogDate(DATETIME值)上的MAX以及与该日志相关的学生和项目名称来查找最近提交的项目日志。(编辑:不是属于该课程的所有学生,只是提交下一个项目日志供审核的学生姓名和项目名称,即可能使用MAX函数的最新日期日志)

这个SQL查询的问题是,它返回许多重复的课程ID,并且返回每个日志的每个学生和项目名称

我希望我已经清楚地描述了这个问题。我怎样才能解决这个问题?谢谢大家!

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子句。我编辑了答案。