2017-05-08 3 views
2

Ich habe eine Tabelle, um die Student Details zu verfolgen und es gibt eine andere Tabelle, um die Leistung des Schülers zu verfolgen.Wie verfolgen Sie die letzte Änderung in einem SQL-Datensatz?

+==========================================+ 
| 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 | 
+==========================================+ 

Leistungstabelle:

+===========================================================================+ 
| 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 | 
+===========================================================================+ 

Ich will die jüngste Leistung und durchschnittliche Punktzahl der Schüler erhalten, wann immer eine Abteilung Änderung des Schülertisch passiert. Unter Berücksichtigung Student 001, die Abteilung Änderungen des Schülers sind

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

Denn 3. Januar 2017, gibt es kein Datum, das kleiner als das Datum in der Leistungstabelle ist.

1. März 2017, Der letzte Rekord Leistungstabelle seit Feb 2 2017 21 2017

April ist die jüngste Aufzeichnung in Leistungstabelle ist aktuell 27. März 2017

Bitte helfen Sie mir in es tun.

+0

Ausgang clear.Can Sie reexplain die Ausgabe nicht überhaupt ist? Warum erste Zeile ausgegeben, so ist und warum zweiten Reihe ab? – KumarHarsh

+0

Bitte posten Sie die SQL-Abfrage, die Sie verwendet haben, um diese Ausgabe zu erhalten? –

+0

@KumarHarsh: Betrachtet man die Student 001 Dept Änderungen hat er 3 Datensätze. Wenn ich das Datum 3. Januar 2017 nehme und es in der Leistungstabelle vergleiche, gibt es keinen Datensatz, der in der Leistungstabelle unter diesem Datum liegt. Für 1. März 2017 gibt es 4 Datensätze Jan 30, Jan 12, Feb 21 und Jan 20. Aber das neueste Datum ist der 21. Februar. – Poppy

Antwort

0

Nehmen Sie ein wenig Schmerzen deutlich zu erklären, wenn mein Skript falsch ist

den Ausgang hoffen, dass Sie erklären ist richtig Weil ich Zweifel über die Ausgabe habe.

Am wichtigsten hoffe, Sie haben genau die gleiche Tabellenstruktur geschrieben.

Aufgrund Ihrer Tabellenstruktur wird mehr Fensterfunktion als erwartet verwendet, was Ihre Leistung beeinträchtigen kann.

Es ist alles zusammen sehr unterschiedliche und wichtige Diskussion über Ihre tatsächliche Anforderung und was sollte Tabellenstruktur und wie sollte es bevölkert sein.

dieses Skript Versuchen mit verschiedenen Beispieldaten und lassen Sie mich wissen,

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

Könnten Sie dies versuchen ...

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 

Dank ..

Verwandte Themen