如何从这些SQL表中获取最大日期

时间:2017-01-26 22:01:45

标签: sql join

我需要列出所有学生的DESC。

算法步骤:

  1. 在表STUDENT_TYPE中,对于每个学生,获取具有最大DT_OF_WORK日期的记录的TYPE_ID。

  2. 找到TYPE_ID后,从表STUDENT_DESC获取DESC

  3. 将所有来自STUDENT的学生列入他们的DESC。

  4. 以下是三个SQL表。

    STUDENT_TYPE

    主键是:(Student_ID, DT_OF_WORK

    |Student_ID  |  TYPE_ID  |  DT_OF_WORK  |  CATEGORY|
    |         1  |        1  |  01-JAN-2017 |         B|
    |         1  |        2  |  11-JAN-2017 |         A|
    |         1  |        1  |  02-JAN-2017 |         A|
    |         1  |        1  |  03-JAN-2017 |         A|
    |         3  |        2  |  16-JAN-2017 |         A|
    |         3  |        1  |  03-JAN-2014 |         A|
    |         3  |        1  |  23-JAN-2012 |         A|
    |         4  |        2  |  02-JAN-2013 |         A|
    

    STUDENT_DESC

    |TYPE_ID|DESC  |
    |      1|LEAD  |
    |      2|TOPPER|
    

    STUDENT

    |STUDENT_ID|NAME  |
    |         1|JACK  |
    |         2|RAVI  |
    |         3|SEENU |
    |         4|RAM   |
    
    • Student_ID(STUDENT_TYPE)= STUDENT_ID(学生)
    • TYPE_ID(STUDENT_TYPE)= TYPE_ID(STUDENT_DESC)

    期望的输出:

    |STUDENT_ID|NAME  |DESC  |
    |         1|JACK  |LEAD  |
    |         2|RAVI  |null  |
    |         3|SEENU |TOPPER|
    |         4|RAM   |TOPPER|
    

    感谢您的时间。

1 个答案:

答案 0 :(得分:1)

您可以通过几种不同方式实现此目标。由于您没有指定哪个数据库引擎,我假设SQL Server。

考虑到你的表有多大,这可能不是最高效的,但这应该可以解决问题:

WITH    Rankings
          AS ( SELECT   *
               FROM     ( SELECT    st.Student_ID
                                  , st.Type_Id
                                  , ROW_NUMBER() OVER ( PARTITION BY st.Student_ID ORDER BY st.DT_Of_Work DESC ) AS RowNumber
                          FROM      Student_Type AS st ) q
               WHERE    q.RowNumber = 1)
    SELECT  s.Student_Id
          , s.Name
          , d.[Desc]
    FROM    Student s
    LEFT OUTER JOIN Rankings c
    ON      s.Student_Id = c.Student_Id
    LEFT OUTER JOIN Student_Desc d
    ON      d.Type_ID = c.Type_ID;

这实际上是通过拆分行并根据分区和ROW_NUMBER()函数中的顺序给出一个数字来实现的。然后,我们选择最低值(值为1),并使用它来确定最新的Type_Id。在少数outer joins的帮助下,我们可以获得所有数据。

旁注:您的预期输出不正确。杰克的DESC应为TOPPER