SQL, чтобы получить максимальную дату с группой по - PullRequest
0 голосов
/ 31 мая 2018

У меня есть таблица транзакций примерно такая ...

-------------------------------------------------------------------------------------
Subject_id | Question_id | Answerd_id | Student_id | Answer_text | Insert_DTM
-------------------------------------------------------------------------------------
5005       | 3004        | 1004       | 1309       | test        | 2018-05-31 12:07:42
-------------------------------------------------------------------------------------
5005       | 3005        | 1005       | 1309       | test        | 2018-05-31 12:07:42
-------------------------------------------------------------------------------------
5005       | 3004        | NULL       | 1309       | Null        | 2018-05-31 12:09:43
-------------------------------------------------------------------------------------
5005       | 3002        | NULL       | 1309       | Null        | 2018-05-31 12:07:42
-------------------------------------------------------------------------------------
5005       | 3005        | 1005       | 1309       | test        | 2018-05-31 11:35:47
-------------------------------------------------------------------------------------
5005       | 3005        | 1005       | 1309       |             |2018-05-31 11:36:37

Из этой таблицы я должен найти самую последнюю строку ответа для студента и идентификатор субъекта.

SQL, который я использую ..

SELECT subject_id, 
       question_id, 
       answer_id, 
       student_id, 
       answer_text, 
       insert_dtm 
FROM   exam_trans 
WHERE  student_id = 1309 
       AND subject_id = 5005 
       AND insert_dtm IN (SELECT Max(insert_dtm) 
                          FROM   exam_trans 
                          WHERE  student_id = 1309 
                                 AND subject_id = 5005 
                          GROUP  BY question_id) 
GROUP  BY subject_id, 
          question_id, 
          answer_id, 
          member_id, 
          answer_text, 
          insert_dtm 
ORDER  BY answer_id, 
          question_id DESC 

Но в качестве вывода я получаю

-------------------------------------------------------------------------------------
Subject_id | Question_id | Answerd_id | Student_id | Answer_text | Insert_DTM
-------------------------------------------------------------------------------------
5005       | 3004        | 1004       | 1309       | test        | 2018-05-31 12:07:42
-------------------------------------------------------------------------------------
5005       | 3005        | 1005       | 1309       | test        | 2018-05-31 12:07:42
---------------------------------------------------------------------------------------
5005       | 3004        | NULL       | 1309       | Null        | 2018-05-31 12:09:43
--------------------------------------------------------------------------------------
5005       | 3002        | NULL       | 1309       | Null        | 2018-05-31 12:07:42

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


Subject_id | Question_id | Answerd_id | Student_id | Answer_text | Insert_DTM
-------------------------------------------------------------------------------------
5005       | 3005        | 1005       | 1309       | test        | 2018-05-31 12:07:42
---------------------------------------------------------------------------------------
5005       | 3004        | NULL       | 1309       | Null        | 2018-05-31 12:09:43
--------------------------------------------------------------------------------------
5005       | 3002        | NULL       | 1309       | Null        | 2018-05-31 12:07:42

3004 должен прийти один раз только с последней отметкой времени ....

Может ли кто-нибудь помочь мне с правильным SQL ...

Я использую Oracle RDS в AWS

Ответы [ 3 ]

0 голосов
/ 31 мая 2018

для этого лучше использовать ROW_NUMBER()

SELECT *
FROM (SELECT *,
             ROW_NUMBER() OVER (PARTION BY Question_id, Subject_id
                                ORDER BY Insert_DTM DESC) as rn
      FROM exam_trans 
      WHERE  student_id = 1309 
        AND  subject_id = 5005 
     )
WHERE rn = 1
0 голосов
/ 31 мая 2018

Вы можете использовать подзапрос и row_number ().

https://stackoverflow.com/a/10515397/7328059 должны ответить на ваш вопрос.

0 голосов
/ 31 мая 2018

Вы, кажется, хотите:

select e.*
from exam_trans e
where Insert_DTM = (select max(e1.Insert_DTM)
                    from  exam_trans e1
                    where e1.Subject_id = e.Subject_id and
                          e1.Question_id = e.Question_id
                   );
...