2010-12-06 166 views
0

我有以下樣本表格格式的信息。每個文件可以有多個等級,我需要爲每個文件選擇最近的等級(基於完成日期)。如果有一個文件有相同的完成日期,我會選擇最好的成績(a是最好的,後面的字母是較低的成績)。這似乎容易,但由於某些原因具有腦屁爲每個'訂單'選擇最近日期的記錄

樣品表:

ID_PK File_No級COMPLETION_DATE

1史密斯甲2010年10月1日

2史密斯C 9/25/2010

3個戴維斯乙2010年11月1日

4約翰遜d 12/5/2010

5約翰遜甲2010年11月1日

6約翰遜Ç2010年10月1日

7米勒X 9/1/2010

8米勒˚F2010年12月1日

9個米勒d 2010年10月1日

理想結果:

1史密斯甲2010年10月1日

3戴維斯乙2010年11月1日

4約翰遜d 12/5/2010

8米勒˚F2010年12月1日

+0

您能否添加預期輸出的示例應該是? – 2010-12-06 17:36:34

回答

1

嘗試此(未測試):

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 

請注意,您可能需要修改特定DB的語法和表名。

2

使用窗函數更高效,也更加簡單,因爲

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 
0

我創建了一個表,您的示例數據。我對錶格測試了以下查詢,並且所有內容似乎都能正常工作,並與示例結果相匹配。


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