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;