Выбор записей с самой последней датой для каждого «заказа» - PullRequest
0 голосов
/ 06 декабря 2010

У меня есть информация в формате таблицы ниже. Каждый файл может иметь несколько оценок, мне нужно выбрать самую последнюю оценку (на основе даты завершения) для каждого файла. Если есть файл с такими же датами завершения, я бы выбрал лучшую оценку (лучшая, а последующие буквы - меньшая). Это кажется легким, но по какой-то причине иметь мозг пердеть

Таблица образцов:

ID_PK File_No Grade Completion_Date

1 Смит А 10/1/2010

2 Смит C 9/25/2010

3 Davis B 11/1/2010

4 Johnson D 12/5/2010

5 Johnson A 11.01.2010

6 Johnson C 10/1 / 2010

7 Миллер Х 9/1 / 2010

8 Miller F 12/1 / 2010

9 Миллер Д 10/1/2010

Идеальные результаты:

1 Smith A 10/1/2010

3 Davis B 11/1/2010

4 Johnson D 12/5/2010

8 Miller F 12/1 / 2010

Ответы [ 3 ]

2 голосов
/ 06 декабря 2010

ИСПОЛЬЗОВАНИЕ ФУНКЦИИ WINDOWING БОЛЬШЕ ЭФФЕКТИВНО, а также проще, чем

with cte AS(
select  '1' AS ID_no,'Smith' AS FILE_NO,'A' AS GRADE,
CAST('10/1/2010' AS DATE) AS CREATION_DATE
union all 
select '2','Smith','C','9/25/2010'
union all 
select '3','Davis','B','11/1/2010'
union all 
select '4','Johnson','D','12/5/2010'
union all 
select '5','Johnson','A','11/1/2010'
union all 
select '6','Johnson','C','10/1/2010'
union all 
select '7','Miller','X','9/1/2010'
union all 
select '8','Miller','F','12/1/2010'
union all 
select '9','Miller','D','10/1/2010')


SELECT X.ID_NO,X.FILE_NO,X.GRADE,X.CREATION_DATE FROM(
SELECT ID_NO,FILE_NO,GRADE,CREATION_DATE ,
ROW_NUMBER() OVER(PARTITION BY FILE_NO ORDER BY CREATION_DATE DESC,GRADE ASC ) AS RN
FROM CTE)AS X
WHERE X.RN=1
ORDER BY ID_NO
1 голос
/ 06 декабря 2010

попробуйте это (не проверено):

select max_grade.*
from `Sample Table` st
inner join (
  select File_No, max(Completion_Date) as Completion_Date
  from `Sample Table`
  group by File_No
) max_date on st.Completion_Date = max_date.CompletionDate
inner join (
  select File_No, Completion_Date, max(Grade) as Grade
  from `Sample Table`
  group by File_No, Completion_Date
) max_grade on st.File_No = max_grade.File_No and st.Completion_Date = max_grade.Completion_Date

Обратите внимание, что вам может потребоваться изменить синтаксис и имя таблицы для вашей конкретной БД.

0 голосов
/ 06 декабря 2010

Я создал таблицу с данными вашего примера. Я проверил следующий запрос к таблице, и все, кажется, работает правильно и соответствует результатам примера.


SELECT 
    ID_PK,
    StudentGrade.File_No, 
    MIN(StudentGrade.Grade), 
    StudentGrade.Completion_Date
FROM
(
    SELECT File_No, MAX(Completion_Date) Completion_Date
    FROM StudentGrade
    GROUP BY File_No
) Student
INNER JOIN StudentGrade ON
    Student.File_No = StudentGrade.File_No 
    AND StudentGrade.Completion_Date = Student.Completion_Date
GROUP BY ID_PK, StudentGrade.File_No, StudentGrade.Completion_Date
ORDER BY ID_PK
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...