В настоящее время я работаю над проектом, в котором мне нужно извлечь последние данные из таблицы для целей отчета.Ниже приведен пример структуры таблицы: -
У каждого учащегося есть несколько курсов, и курс_ид для языка программирования + ve и для языка не-программирования -ve.Я хочу извлечь последний язык программирования и не язык программирования course_id для каждого студента.
Я использую приведенный ниже SQL-запрос и могу извлечь данные.
CREATE TABLE COURSE
("STUDENT_ID" int, "COURSE_ID" int, "COURSE_NAME" varchar2(31), "COURSE_START_DATE" timestamp)
;
INSERT ALL
INTO COURSE ("STUDENT_ID", "COURSE_ID", "COURSE_NAME", "COURSE_START_DATE")
VALUES (100001, -100, 'C Programming Language', '04-Feb-2019 12:00:00 AM')
INTO COURSE ("STUDENT_ID", "COURSE_ID", "COURSE_NAME", "COURSE_START_DATE")
VALUES (100001, -200, 'Java Programming Language', '11-Feb-2019 12:00:00 AM')
INTO COURSE ("STUDENT_ID", "COURSE_ID", "COURSE_NAME", "COURSE_START_DATE")
VALUES (100001, -300, 'C# Programming Language', '07-Feb-2019 12:00:00 AM')
INTO COURSE ("STUDENT_ID", "COURSE_ID", "COURSE_NAME", "COURSE_START_DATE")
VALUES (100001, 100, 'Data Structure and algorithms', '05-Feb-2019 12:00:00 AM')
INTO COURSE ("STUDENT_ID", "COURSE_ID", "COURSE_NAME", "COURSE_START_DATE")
VALUES (100001, 200, 'Computer Graphics', '13-Feb-2019 12:00:00 AM')
INTO COURSE ("STUDENT_ID", "COURSE_ID", "COURSE_NAME", "COURSE_START_DATE")
VALUES (100001, 300, 'Networking', '02-Feb-2019 12:00:00 AM')
INTO COURSE ("STUDENT_ID", "COURSE_ID", "COURSE_NAME", "COURSE_START_DATE")
VALUES (100002, -300, 'C# Programming Language', '12-Feb-2019 12:00:00 AM')
INTO COURSE ("STUDENT_ID", "COURSE_ID", "COURSE_NAME", "COURSE_START_DATE")
VALUES (100002, -400, 'Python Programming Language', '07-Feb-2019 12:00:00 AM')
INTO COURSE ("STUDENT_ID", "COURSE_ID", "COURSE_NAME", "COURSE_START_DATE")
VALUES (100002, -500, 'JavaScript Programming Language', '08-Feb-2019 12:00:00 AM')
INTO COURSE ("STUDENT_ID", "COURSE_ID", "COURSE_NAME", "COURSE_START_DATE")
VALUES (100002, 100, 'Data Structure and algorithms', '17-Jan-2019 12:00:00 AM')
INTO COURSE ("STUDENT_ID", "COURSE_ID", "COURSE_NAME", "COURSE_START_DATE")
VALUES (100002, 300, 'Computer Graphics', '26-Jan-2019 12:00:00 AM')
INTO COURSE ("STUDENT_ID", "COURSE_ID", "COURSE_NAME", "COURSE_START_DATE")
VALUES (100002, 400, 'DataBase Management', '10-Jan-2019 12:00:00 AM')
INTO COURSE ("STUDENT_ID", "COURSE_ID", "COURSE_NAME", "COURSE_START_DATE")
VALUES (100003, -500, 'JavaScript Programming Language', '07-Feb-2019 12:00:00 AM')
INTO COURSE ("STUDENT_ID", "COURSE_ID", "COURSE_NAME", "COURSE_START_DATE")
VALUES (100003, -600, 'SQL', '13-Feb-2019 12:00:00 AM')
INTO COURSE ("STUDENT_ID", "COURSE_ID", "COURSE_NAME", "COURSE_START_DATE")
VALUES (100003, -200, 'Java Programming Language', '17-Jan-2019 12:00:00 AM')
INTO COURSE ("STUDENT_ID", "COURSE_ID", "COURSE_NAME", "COURSE_START_DATE")
VALUES (100003, 300, 'Networking', '04-Feb-2019 12:00:00 AM')
INTO COURSE ("STUDENT_ID", "COURSE_ID", "COURSE_NAME", "COURSE_START_DATE")
VALUES (100003, 400, 'DataBase Management', '05-Jan-2019 12:00:00 AM')
INTO COURSE ("STUDENT_ID", "COURSE_ID", "COURSE_NAME", "COURSE_START_DATE")
VALUES (100003, 600, 'Cryptography', '18-Jan-2019 12:00:00 AM')
SELECT * FROM dual
;
SELECT STUDENT_ID
,COURSE_ID
,COURSE_NAME
,COURSE_START_DATE
FROM (
SELECT
ROW_NUMBER() OVER(PARTITION BY STUDENT_ID ORDER BY COURSE_START_DATE DESC) AS ROW_NUM
,STUDENT_ID
,COURSE_ID
,COURSE_NAME
,COURSE_START_DATE
FROM
COURSE
WHERE COURSE_ID 0) TEMP1 WHERE TEMP1.ROW_NUM = 1;
Но проблема в реальной таблицеочень большой.Есть почти 85 тыс. Строк, и этот запрос занимает некоторое время.Есть ли другой лучший подход.Я использую Oracle 11g R2.Пожалуйста, предложите
Это ссылка SQLfiddle http://sqlfiddle.com/#!4/b3fe1/8