Извлечение последних записей отдельных лиц путем объединения двух таблиц - PullRequest
1 голос
/ 24 июня 2019

Мне нужно получить последнюю запись об ученике, которая была получена путем объединения двух таблиц:

table 1:      table 2:

id name       id  marks    EXAM attended time        status
--------      ----------------------------------------------
1  ABC         1   90     2019-04-05 06:00:00          PASS 
2  DEF         1   25     2018-06-05 08:00:00          FAIL 
               2   45     2019-03-05 06:00:00          FAIL
               2   22     2019-01-05 09:00:00          FAIL

При объединении обеих таблиц я получил это:

#  name    marks   EXAM ATTENDED TIME         status 
------------------------------------------------------
1   ABC     90     2019-04-05 06:00:00          PASS    
2   ABC     25     2018-06-05 08:00:00          FAIL 
3   DEF     45     2019-03-05 06:00:00          FAIL   
4   DEF     22     2019-01-05 09:00:00          FAIL
5   DEF     55     2019-04-05 09:00:00          PASS
6   DEF     66     2019-05-05 09:00:00          PASS
7   DEF     99     2018-05-05 09:00:00          PASS

Я хочу получить последний результат для даты и времени.

Вывод, который мне нужен:

id  name    marks   EXAM ATTENDED TIME         status
------------------------------------------------------
1   ABC     90     2019-04-05 06:00:00          PASS 
6   DEF     66     2019-05-05 09:00:00          PASS

Ответы [ 4 ]

1 голос
/ 24 июня 2019

Вы можете использовать оконную функцию (ROW_NUMBER).

SELECT 
        x.id
    ,   x.NAME
    ,   x.marks
    ,   x.ExamAttendTime
    ,   x.status 
FROM 
    (
    SELECT 
            t1.id
        ,   t1.NAME
        ,   t2.marks
        ,   t2.ExamAttendTime
        ,   t2.status
        ,   ROW_NUMBER() OVER (PARTITION BY t1.id ORDER BY t2.ExamAttendTime DESC) AS ROWNUMBER
    FROM 
    dbo.Table1 t1 
    JOIN dbo.Table2 t2 ON t2.id = t1.id
    ) x
WHERE
    x.ROWNUMBER = 1
1 голос
/ 24 июня 2019

Вы можете попробовать ниже, используя коррелированный подзапрос

select * from table1 a1
inner join table2 a on a1.id=a.id
where  exam_attended_time in (select max(exam_attended_time) from table2 b where a.id=b.id)

ИЛИ вы можете использовать row_number(), если ваш БД поддерживает его -

select * from 
(
select a.name,a1.*,row_number(partition by a.id order by exam_attended_time desc)rn from table1 a1
    inner join table2 a on a1.id=a.id
)X where rn=1
0 голосов
/ 24 июня 2019

ЕСЛИ вы используете SQL SERVER, тогда вы можете использовать TOP, как показано ниже, для получения последних записей

SELECT A.id, 
    A.name, 
    B.marks, 
    B.EXAM_attended_time, 
    B.Status
FROM table1 A
OUTER APPLY (SELECT TOP 1 *
            FROM table2 B WHERE B.id = A.id
            ORDER BY B.EXAM_attended_time DESC) B 
WHERE B.ID = A.id
0 голосов
/ 24 июня 2019

Я не знаю, как вы выбираете запись, например, отметки «99» и «66» и время посещения экзамена. '2019-05-05 09:00:00', которого нет в самой таблице.

хотя это может помочь вам в получении правильных данных.

select a.id,a.name,b.marks,b.[EXAM attended time],b.[status] from table 1 a 
join table 2 b on a.id=b.id where [EXAM attended time] in 
(select max([EXAM attended time])[EXAM attended time]from exam group by id)
...