Нахождение самой последней даты в SQL для диапазона строк - PullRequest
0 голосов
/ 10 января 2020

У меня есть таблица оценок работы курса с заголовками таблицы:

Код модуля, номера курсов, студент, дата подачи, отметка

Пример данных в порядке заголовков таблицы:

Математика, 1, Пэрри, 12 июня 92, 20

Математика, 2, Пэрри, 13 июня 92, 20

Математика, 2, Пэрри, 15 -JUN-92, 25

Ожидаемые данные после запроса

Математика, 1, Пэрри, 12-ИЮН-92, 20

Математика, 2, Пэрри, 15-ИЮН -92, 25

Иногда студент сдает экзамен, и у него есть дополнительный ряд для части курсовой работы. Мне нужно попытаться получить только последние курсовые работы в таблице. Следующее работает, когда я изолирую конкретного студента:

SELECT * 
FROM TABLE
WHERE NAME = ‘NAME’
AND DATE IN (SELECT MAX(DATE)
            FROM TABLE 
            WHERE NAME = ‘NAME’
            GROUP BY MODULE_CODE, COURSEWORK_NUMBER, STUDENT)

Это дает правильное решение для этого человека, давая мне самые последние даты для каждой строки (каждой курсовой работы) в таблице. Тем не менее, это:

 SELECT * 
FROM TABLE
AND DATE IN (SELECT MAX(DATE)
             FROM TABLE 
             GROUP BY MODULE_CODE, COURSEWORK_NUMBER, STUDENT)

Не дает мне тот же стол, но для каждого человека, который пытался курсовую работу. Куда я иду не так? Извините, если детали немного скудны, но я беспокоюсь о плагиате.

Работа с SQL плюс

Ответы [ 3 ]

2 голосов
/ 11 января 2020

Это хорошее место для использования Oracle keep синтаксис:

select
    module_code,
    course_work_number,
    student,
    max(date_submitted) date_submitted,
    max(mark) keep(dense_rank first order by date_submitted desc) mark
from mytable
group by module_code, course_work_number, student

Демонстрация на DB Fiddle :

MODULE_CODE | COURSE_WORK_NUMBER | STUDENT | DATE_SUBMITTED | MARK
:---------- | -----------------: | :------ | :------------- | ---:
Maths       |                  1 | Parry   | 12-JUN-92      |   20
Maths       |                  2 | Parry   | 15-JUN-92      |   25
1 голос
/ 10 января 2020

Вы ищете групповой максимум. См. Эту статью от MySQL: https://dev.mysql.com/doc/refman/8.0/en/example-maximum-column-group-row.html Я не уверен в правильном синтаксисе для Oracle, но он должен быть похожим. По крайней мере, структура запроса должна поставить вас на правильный путь.

0 голосов
/ 10 января 2020

Вы можете использовать функцию row_number для решения этой проблемы:

select x.*
(SELECT a.*,row_number() over(partition by name order by date desc) as row1
FROM TABLE a)x
where x.row1=1

Идея состоит в том, чтобы назначить номер строки на основе даты, а затем выбрать случаи, когда номер строки равен 1. Надеюсь, это поможет.

...