2017-05-08 7 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、学生のDEPTの変更が 2017年1月3日、については

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

ある考慮すると、パフォーマンステーブル内の日付より小さい一切日付はありません。

2017年3月1日、パフォーマンステーブル内の最新のレコードが日付である2017年2月21日

2017年4月2日、パフォーマンステーブル内の最新のレコードが日付である2017年3月27日

私を助けてくださいしている。私のスクリプトは

はあなたが説明していた出力が正しいことを願っています間違っている場合は、これを試みることができる

+0

出力は、第1行出力は以降ので、なぜ第二列であるなぜあなたは?出力をreexplain全くclear.Canではないでしょうか? – KumarHarsh

+0

その出力を取得するために使用したSQLクエリを投稿してください。 –

+0

@KumarHarsh:学生001部門が変更されたことを考えると、彼は3つのレコードを持っています。私が日付を取った、2017年1月3日、それをパフォーマンステーブルで比較すると、パフォーマンステーブルにその日付よりも小さいレコードはありません。 2017年3月1日には、1月30日、1月12日、2月21日、20日の4つのレコードがあります。しかし、最新の日付は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 

おかげ..

関連する問題