我需要列出所有学生的DESC。
算法步骤:
在表STUDENT_TYPE中,对于每个学生,获取具有最大DT_OF_WORK日期的记录的TYPE_ID。
找到TYPE_ID后,从表STUDENT_DESC获取DESC
将所有来自STUDENT的学生列入他们的DESC。
以下是三个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|NAME |DESC |
| 1|JACK |LEAD |
| 2|RAVI |null |
| 3|SEENU |TOPPER|
| 4|RAM |TOPPER|
感谢您的时间。
答案 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
。