Bonjour,

J'ai deux tables. Une table Group et une table Event.

Un Event est en relation avec un Group et dispose d'une Date. Un Group peut être en relation avec plusieur Event sous la seul contrainte que la Date soit unique.
Un Event a une EndDate qui est calculé en fonction de la Date de l'event suivant. Un Event prend fin dès qu'un autre du même Group débute.

J'aimerais faire un UPDATE qui me met à jour la EndDate de tout mes Event.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
GROUPE G1
    EVENT V10 01/01/2015
    EVENT V11 03/01/2015
    EVENT V12 05/01/2015
 
GROUPE G2
    EVENT V20 01/01/2015
    EVENT V21 03/01/2015
Pour le moment, je suis arrivé à ça :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
UPDATE V1
SET T1.EndDate = T2.Date
FROM Event Event T1
INNER JOIN Event T2
ON T1.Group_Id = T2.Group_Id
AND T1.Date < T2.Date
La jointure me donnerais les résultats suivants :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
V10 - V11
V10 - V12
V11 - V12
V20 - V21
Et je cherche à avoir pour chaque Event uniquement la jointure avec la Date la plus petite :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
V10 - V11
V11 - V12
V20 - V21
J'avais l'idée de faire un ORDER BY sur la date de la table jointe et de faire un Distinct sur l'id de l'Event mais je n'arrive à rien pondre de syntaxiquement correcte.

Help.

Edit : Résolu =)

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
UPDATE A1 
SET A1.DateFin = A2.MinDateFin
FROM Event A1 
INNER JOIN (
	SELECT B1.Id, MIN(B2.DateFin) AS MinDateFin
	FROM Event B1 
	INNER JOIN (
		SELECT C1.Id, C2.Date AS DateFin
		FROM Event C1
			INNER JOIN Event C2
		ON C1.Groupt_Id = C2.Group_Id
			AND C1.DateEffet < C2.DateEffet
		) B2
	ON B1.Id = B2.Id
	GROUP BY B1.Id
	) A2
ON A1.Id = A2.Id