2017-05-08 73 views
2

我有一張表來跟蹤學生的詳細信息,還有另一張表來跟蹤學生的表現。如何跟蹤sql記錄中的最新修改?

+==========================================+ 
| ID  | Department  | Date   | 
+==========================================+ 
| 001  | English   | Jan 3 2017 | 
| 001  | English   | Feb 24 2017 | 
| 001  | Science   | Mar 1 2017 | 
| 001  | Maths   | Mar 2 2017 | 
| 001  | Maths   | Mar 21 2017 | 
| 001  | Maths   | Apr 2 2017 | 
| 001  | English   | Apr 7 2017 | 
| 002  | Maths   | Feb 1 2017 | 
| 002  | Maths   | Apr 7 2017 | 
| 003  | Maths   | Apr 3 2017 | 
| 003  | Maths   | Apr 7 2017 | 
| 004  | Science   | Feb 1 2017 | 
| 004  | Science   | Mar 1 2017 | 
| 004  | Maths   | Apr 7 2017 | 
| 004  | English   | Apr 9 2017 | 
+==========================================+ 

性能表:

+===========================================================================+ 
| ID  | Department   | Best score| Avg score | Date  | 
+===========================================================================+ 
| 001  | English    | 98  | 85   | Jan 30 2017 | 
| 001  | English    | 89  | 80.2  | Apr 14 2017 | 
| 001  | Science    | 75  | 79.8  | May 1 2017 | 
| 001  | Maths    | 88  | 80.2  | Jan 12 2017 | 
| 001  | Maths    | 79  | 75.6  | Feb 21 2017 | 
| 001  | Maths    | 90  | 80.5  | Jan 20 2017 | 
| 001  | English    | 80  | 79.3  | Mar 27 2017 | 
| 002  | Maths    | 90  | 78.4  | Mar 31 2017 | 
| 002  | Maths    | 85  | 80.2  | May 7 2017 | 
| 003  | Maths    | 75  | 79.1  | Apr 30 2017 | 
| 003  | Maths    | 80  | 80.0  | Feb 7 2017 | 
| 004  | Science    | 60  | 70.3  | May 1 2017 | 
| 004  | Science    | 72  | 69.9  | Mar 10 2017 | 
| 004  | Maths    | 70  | 66.8  | Jan 17 2017 | 
| 004  | English    | 65  | 65.0  | Mar 29 2017 | 
+===========================================================================+ 

我想最近的表現,每當一個部門的變化在學生表發生在學生的平均分數。考慮到學生001,學生的部門變化

| 001  | English   | Jan 3 2017 | 
| 001  | Science   | Mar 1 2017 | 
| 001  | Maths   | Apr 2 2017 | 

因爲, 2017年1月3日,沒有日期小於性能表的日期。

2017年3月1日,最近在性能表中記錄日期2017年2月21日

2017年4月2日,最近在性能表中記錄日期2017年3月27日

請幫我在正在做。

+0

輸出是不是所有你clear.Can重釋輸出?爲什麼第一行輸出是這樣,爲什麼第二行起? – KumarHarsh

+0

請發佈您用於獲取該輸出的SQL查詢嗎? –

+0

@KumarHarsh:考慮到學生001部門的變化,他有3條記錄。如果我將2017年1月3日的日期與性能表中的日期進行比較,那麼在性能表中沒有小於此日期的記錄。對於2017年3月1日,有4個記錄1月30日,1月12日,2月21日和1月20日。但最近的日期是2月21日。 – Poppy

回答

0

取少許疼痛解釋清楚,如果我的腳本錯誤

希望你有解釋的輸出是正確的。我很抱歉懷疑輸出。

最重要的是希望你發佈了完全相同的表結構。

由於您的表結構,更多的窗口功能使用比預期,這可能會妨礙您的表現。

關於您的真實需求以及應該如何填充表格結構以及如何填充它們,這些都是非常不同和重要的討論。

試試這個腳本各種樣本數據,讓我知道,

declare @StudentDetails table(ID varchar(20) 
,Department varchar(20),Dates Date) 
insert into @StudentDetails VALUES 
('001','English','Jan 3 2017 ') 
,('001','English','Feb 24 2017') 
,('001','Science','Mar 1 2017 ') 
,('001','Maths','Mar 2 2017 ') 
,('001','Maths','Mar 21 2017') 
,('001','Maths','Apr 2 2017 ') 
,('001','English','Apr 7 2017 ') 
,('002','Maths','Feb 1 2017 ') 
,('002','Maths','Apr 7 2017 ') 
,('003','Maths','Apr 3 2017 ') 
,('003','Maths','Apr 7 2017 ') 
,('004','Science','Feb 1 2017 ') 
,('004','Science','Mar 1 2017 ') 
,('004','Maths','Apr 7 2017 ') 
,('004','English','Apr 9 2017 ') 
--select * from @StudentDetails 

declare @Performance table(ID varchar(20) 
,Department varchar(20),Bestscore float,Avgscore float,PDate date) 

insert into @Performance VALUES 
('001','English',98,85 ,'Jan 30 2017') 
,('001','English',89,80.2 ,'Apr 14 2017') 
,('001','Science',75,79.8 ,'May 1 2017 ') 
,('001','Maths',88,80.2 ,'Jan 12 2017') 
,('001','Maths',79,75.6 ,'Feb 21 2017') 
,('001','Maths',90,80.5 ,'Jan 20 2017') 
,('001','English',80,79.3 ,'Mar 27 2017') 
,('002','Maths',90,78.4 ,'Mar 31 2017') 
,('002','Maths',85,80.2 ,'May 7 2017 ') 
,('003','Maths',75,79.1 ,'Apr 30 2017') 
,('003','Maths',80,80.0 ,'Feb 7 2017 ') 
,('004','Science',60,70.3 ,'May 1 2017 ') 
,('004','Science',72,69.9 ,'Mar 10 2017') 
,('004','Maths',70,66.8 ,'Jan 17 2017') 
,('004','English',65,65.0 ,'Mar 29 2017') 
--select * from @Performance 
--declare @SID varchar(20)='001' 

;with CTE as 
(
select * 
,ROW_NUMBER()over(partition by id order by Dates,Department) rn 
from @StudentDetails 
--where [email protected] 
) 
,CTE3 AS(
select c.id, c.Department,c.dates,c.rn,1 rn3 
from cte c 
where rn=1 

union ALL 

select c.id, c.Department,c.dates,c.rn 
,case when c.Department=c3.Department and c.dates>c3.dates 
then cast(c3.rn3 as int) 
else cast(c3.rn3+1 as int) end 
from cte c 
inner join cte3 c3 
on c.id=c3.id 
where c.rn=c3.rn+1 
and c.rn<=7 
) 
,cte4 AS(
select *,0 rn1 from cte3 where rn=1 
union ALL 
select * from 
(
select * ,ROW_NUMBER()over(PARTITION by id,rn3 order by dates desc) rn1 
from cte3 
where rn3>1 
)t4 where t4.rn1=1 
) 

select c.id,c.department,c.dates,fn.Avgscore AVGScroe,fn.pdate RecentPDate 
from cte4 c 
OUTER apply(
select * from 
(select p.*,ROW_NUMBER()over(order by pdate desc)rn2 
from @Performance P 
where c.id=p.id and p.pDate<c.dates)t4 
where rn2=1)fn 
order by c.id 
0

你可以試試這個...

SELECT S.ID,S.DATE,MAX(P.AVG_SCORE),MAX(P.BEST_SCORE) 
FROM STUDENT S, PERFORMANCE P 
WHERE P.DATE < S.DATE AND P.ID = S.ID 
GROUP BY S.ID,S.DATE 

謝謝..