Mysql 最大记录,包括作为最大记录的空值
我有一个查询,查看所有学生计划的注册情况。当我得到我所有的成绩时,我意识到许多学生的课程注册都有多个学生注册到同一个课程;它们有不同的结束日期和开始日期。我需要获取所有的计划注册和那些带有最大结束日期的记录。我尝试了几个查询,但是我没有得到所需的结果,相反,空值被忽略,我只得到最大记录,但是空值被忽略,它们不应该被忽略。有一些学生注册到同一个课程,但一个记录有结束日期,而另一个没有。我需要获取结束日期为空的记录,在其他情况下,两个记录都有结束日期,在这种情况下,我应该获取最大结束日期 我正在尝试获得下面我的结果这样的记录。 我尝试了下面的查询,但它似乎忽略了空值Mysql 最大记录,包括作为最大记录的空值,mysql,sql,sql-server-2008,date,Mysql,Sql,Sql Server 2008,Date,我有一个查询,查看所有学生计划的注册情况。当我得到我所有的成绩时,我意识到许多学生的课程注册都有多个学生注册到同一个课程;它们有不同的结束日期和开始日期。我需要获取所有的计划注册和那些带有最大结束日期的记录。我尝试了几个查询,但是我没有得到所需的结果,相反,空值被忽略,我只得到最大记录,但是空值被忽略,它们不应该被忽略。有一些学生注册到同一个课程,但一个记录有结束日期,而另一个没有。我需要获取结束日期为空的记录,在其他情况下,两个记录都有结束日期,在这种情况下,我应该获取最大结束日期 我正在尝试
Table #allprgms_enroll has all my program enrollments
select t1.*
-- into #MaxPrgmEndDate
from #allprgms_enroll t1
where t1.endDate =
(select MAX(t2.endDate)
from #allprgms_enroll t2
where t1.studentID = t2.studentID and
t1.programName = t2.programName
)
ORDER BY T1.StudentID
Table #allprgms_enroll
id FirstName last_name DOB program Start Date endDate
11 Aaruinq abc 01/01/1988 Science 162 2015-11-04 00:00:00.000 NULL
11 Aaruinq abc 01/01/1988 Science 162 2010-10-04 00:00:00.000 2015-08-26 00:00:00.000
12 Amber DEF 02/02/1995 Math 143 2012-10-04 00:00:00.000 2012-10-04 00:00:00.000
12 Amber DEF 02/02/1995 Math 143 2012-10-04 00:00:00.000 2016-10-04 00:00:00.000
12 Amber DEF 02/02/1995 Economics 143 2012-10-04 00:00:00.000 2016-10-04 00:00:00.000
15 Rose ghj 02/22/1995 Economics 146 2012-10-04 00:00:00.000 NULL
需要的结果
id FirstName last_name DOB program Start Date endDate
11 Aaruinq abc 01/01/1988 Science 162 2015-11-04 00:00:00.000 NULL
12 Amber DEF 02/02/1995 Math 143 2012-10-04 00:00:00.000 2016-10-04 00:00:00.000
12 Amber DEF 02/02/1995 Economics 143 2012-10-04 00:00:00.000 2016-10-04 00:00:00.000
15 Rose ghj 02/22/1995 Economics 146 2012-10-04 00:00:00.000 NULL
这个答案使用了一种涉及工会的方法。联盟的前一半目标是那些结束日期为空的人员/计划组。工会的后半部分针对那些没有空结束日期的人员/计划组。在这种情况下,我们将保留具有最大结束日期的记录 这个问题有点棘手,因为您的需求涉及一个聚合,但实际上您希望保留一个空值的记录。正如您所指出的,默认情况下聚合函数将忽略空值
您使用的是MySQL还是MS SQL Server?请参阅
SELECT id, FirstName, last_name, DOB, program,`Start Date`, endDate
FROM #allprgms_enroll
WHERE endDate IS NULL
UNION ALL
SELECT t1.id, t1.FirstName, t1.last_name, t1.DOB, t1.program,
t1.`Start Date`, t1.endDate
FROM #allprgms_enroll t1
INNER JOIN
(
SELECT id, program, MAX(endDate) AS maxEndDate
FROM #allprgms_enroll
GROUP BY id, program
HAVING SUM(CASE WHEN endDate IS NULL THEN 1 ELSE 0 END) = 0
) t2
ON t1.id = t2.id AND
t1.program = t2.program AND
t1.endDate = t2.maxEndDate
ORDER BY
id, program;