最大记录包括Null值作为最大记录

时间:2018-02-01 04:56:48

标签: mysql sql sql-server-2008 date

我有一个查询所有学生计划注册的查询。当我得到所有结果时,我发现很多学生的课程注册都有多个相同课程的注册;他们有不同的结束日期和开始日期。我需要获得所有程序注册和那些具有格言结束日期的记录。我已经尝试了几个查询但是我没有得到所需的结果,相反,空值被忽略而我只获得最大记录,但是null值被忽略,不应忽略它们。有些学生注册到同一个程序,但是一个记录有一个结束日期,而另一个记录没有在结束日期得到一个空值,而在其他情况下,两个记录都有一个结束日期,在这种情况下,我应该得到最大结束日期 我正试图获得如下结果的记录。 我已经尝试了下面的查询,但似乎忽略了空值

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 

1 个答案:

答案 0 :(得分:1)

这个答案使用涉及联盟的方法。工会的前半部分针对那些NULL结束日期的人/计划组。联盟的后半部分针对那些的人员/程序组,其结束日期为NULL。在这种情况下,我们保留具有最大结束日期的记录。

这个问题有点棘手,因为您的要求涉及聚合,但实际上您希望保留具有NULL值的记录。正如您所指出的,默认情况下,聚合函数将忽略NULL个值。

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;

Demo