Дата последнего ввода, независимо от темы - PullRequest
0 голосов
/ 19 октября 2011

Заранее спасибо за помощь, у меня есть запрос, который прекрасно работает, но мое требование - найти дату последнего приема студента независимо от предмета

Ответы [ 3 ]

3 голосов
/ 19 октября 2011

Это хорошее применение для функций окна ранжирования .

Предположим, вы определили T_Subject более или менее, как у вас уже есть:

  SELECT StudentID,
         MAX(Created) AS [Created],
         'Whatever' AS [Subject Name]
    FROM T_Student_Whatever
GROUP BY StudentID
   UNION ALL
  SELECT ... and so on for each T_Student_Foo...

Затем вы можете получить самую последнюю регистрацию по предмету (вы называете это "Последняя запись студента")на StudentID с:

SELECT StudentID,
       Created,
       [Subject Name]
  FROM (SELECT T_Subjects.*,
               ROW_NUMBER() OVER (PARTITION BY StudentID ORDER BY Created DESC)
                 AS [ranking] -- rank subject enrollment by recency
          FROM T_Subjects)
 WHERE ranking = 1            -- now select only the first ranked per StudentID

И затем вы можете присоединить этот запрос к вашей таблице T_Students, чтобы получить имена и номера мобильных телефонов и т. д.

Обновление 2011-10-20

Не совсем понятно, что ищет ОП, но предпочтительнее может быть RANK(), а не ROW_NUMBER().Первый из них будет дублировать ранжирование по эквивалентным характеристикам разделов, то есть записи могут «связывать» N-е место.

Например, если предположить, что ученик с идентификатором # 1 последний раз вчера принимал и Computing, и History, но ученик #2 самое последнее время, когда компьютер занимался вычислениями две недели назад, разница будет:

[ RANK()d ]
 StudentID | StudentLastEntry | SubjectName
-----------+------------------+-------------
         1 |       2011-10-19 | Computing
         1 |       2011-10-19 | History
         2 |       2011-10-06 | Computing

против, например,

[ ROW_NUMBER()d ]
 StudentID | StudentLastEntry | SubjectName
-----------+------------------+-------------
         1 |       2011-10-19 | History       -- or 'Computing'
         2 |       2011-10-06 | Computing
3 голосов
/ 19 октября 2011

Я думаю, что запрос ниже даст вам то, что вы хотите. Если к последней записи привязано несколько студентов, то все они вернутся. Я исправил некоторые незначительные проблемы, а затем добавил несколько последних строк, предложение WHERE.

    WITH  T_Subjects
        AS ( SELECT  T_Student_History.StudentID ,  --Typo here?
                     MAX(T_Student_History.Created) AS [Student Last entry] ,
                     'History' AS [Subject Name]
             FROM    T_Student_History
             GROUP BY T_Student_History.StudentID
             UNION ALL
             SELECT  T_Student_geography.StudentID ,
                     MAX(T_Student_geography.Created) AS [Student Last entry] ,
                     'Geography' AS [Subject Name]
             FROM    T_Student_geography
             GROUP BY T_Student_geography.StudentID
             UNION ALL
             SELECT  T_Student_Computing.StudentID ,
                     MAX(T_Student_Computing.Created) AS [Student Last entry] ,
                     'Computing' AS [Subject Name]
             FROM    T_Student_Computing
             GROUP BY T_Student_Computing.StudentID
           )
   SELECT   T_Students.StudentID ,
            T_Students.Forename + ' ' + T_Students.Surname AS [Student Description] ,
            T_Students.Email ,
            T_Students.Mobile ,
            CONVERT(VARCHAR(11), T_Subjects.[Student Last Entry], 101) AS [Student Last Entry],
          -- Do you really want the above as a String and not a date?
            T_Subjects.[Student Last Entry] ,
            T_Subjects.[Subject Name]
   FROM     T_Students
   LEFT OUTER JOIN T_Subjects
            ON T_Students.StudentID = T_Subjects.StudentID
   WHERE    T_Subjects.[Student Last Entry] = ( SELECT MAX([Student Last Entry])
                                                FROM     T_Subjects ts2
                                                WHERE    ts2.StudentID = T_Students.StudentID
                                          ) 
2 голосов
/ 19 октября 2011

Еще проще, вы можете использовать Over () с MAX. Попробуйте это в вашем последнем SELECT

MAX(T_Subjects.StudentLastEntry) 
    OVER (PARTITION BY T_Subjects.StudentID) AS StudentLastEntry

Многие знают об использовании OVER и PARTITION BY с функциями ранжирования, но вы также можете использовать его с другими агрегатами, такими как MAX и COUNT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...