Bonjour,

Je vais commencer par un exemple d'extrait de base de données, puis vous montrer deux requêtes SQL que j'ai avant de vous poser ma question

Voici l'exemple
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
19
20
21
22
23
24
25
26
27
28
29
30
 
CREATE TABLE StatsAppli	(Id int, 
			 AppName varchar(10),
			 ProjName varchar(30), 
			 AppStatus number(1),
			 DateStatus date,
			 Compte number(1),
			 MaintComment varchar(200),
			 CONSTRAINT pk_StatsAppli PRIMARY KEY(Id, AppName, ProjName),
			 CONSTRAINT fk_SA_AppName FOREIGN KEY(AppName, ProjName) REFERENCES Application(AppName, ProjName) ON DELETE CASCADE
			);
 
--pour auto incrémenter l'id
CREATE SEQUENCE	seq_StatsAppli
	START WITH 1
	MINVALUE 1
	NOCYCLE
	NOCACHE
	ORDER;
 
 
--pour insérer l'id
CREATE OR REPLACE TRIGGER trg_StatsAppli
	BEFORE INSERT ON StatsAppli
	REFERENCING OLD AS old NEW AS new
	FOR EACH ROW
	BEGIN
		SELECT seq_StatsAppli.nextval INTO :new.Id FROM DUAL;
	END;
/

un exemple de données (pour une seule appli, données séparées par un pipe) :
1 | appli | projet | 1 | date | 1 | commentaire
10 | appli | projet | 1 | date+1 | 1 | commentaire

20 | appli | projet | 0 | date+2 | 1 | commentaire
30 | appli | projet | 0 | date+3 | 1 | commentaire
40 | appli | projet | 0 | date+4 | 1 | commentaire

50 | appli | projet | 1 | date+5 | 1 | commentaire
60 | appli | projet | 1 | date+6 | 1 | commentaire
70 | appli | projet | 1 | date+7 | 1 | commentaire

80 | appli | projet | 0 | date+8 | 1 | commentaire
90 | appli | projet | 0 | date+9 | 1 | commentaire
100 | appli | projet | 0 | date+10 | 1 | commentaire
110 | appli | projet | 0 | date+11 | 1 | commentaire

120 | appli | projet | 1 | date+12 | 1 | commentaire
l'id est bien auto incrémenté 1 par 1 mais c'est pour montrer qu'il peut y avoir d'autres données entre chaque.


Enfin mes requêtes avec commentaire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
--cette requête me permet de sélectionner le dernier enregistrement dans une série de 1 ou de zéro (ici les lignes dont l'id est 10, 40, 70 et 110)
SELECT day, hour, maintcomment, compte, appstatus FROM 
        ( 
                SELECT appstatus, datestatus, to_char(datestatus, 'DD/MM/YYYY') day, to_char(datestatus, 'HH24:MI') hour, maintcomment, compte, LEAD(appstatus) OVER (partition BY appname, projname ORDER BY datestatus) AS teststatus FROM statsappli WHERE appname='nom_appli' AND projname='nom_projet' 
        ) 
WHERE teststatus<>appstatus AND compte=1;
 
--cette requête fait l'inverse, elle sélectionne le 1er de chaque série (20, 50, 80 et 120)
SELECT day, hour, maintcomment, compte, appstatus FROM 
        ( 
                SELECT appstatus, datestatus, to_char(datestatus, 'DD/MM/YYYY') day, to_char(datestatus, 'HH24:MI') hour, maintcomment, compte, LAG(appstatus) OVER (partition BY appname, projname ORDER BY datestatus) AS teststatus FROM statsappli WHERE appname='nom_appli' AND projname='nom_projet' 
        ) 
WHERE teststatus<>appstatus AND compte=1;
Ma première question :

Comment faire en sorte que la deuxième requête prenne en compte le premier enregistrement de la première série ? (car il ne le fait pas actuellement)

Ma deuxième :

Je dois modifier tous les champs compte du groupe
20 | appli | projet | 0 | date+2 | 1 | commentaire
30 | appli | projet | 0 | date+3 | 1 | commentaire
40 | appli | projet | 0 | date+4 | 1 | commentaire
(par exemple)

je veux donc créer une requête qui update tous les enregistrements entre le 1er et le dernier (d'où l'apparition de mes deux requêtes) mais je ne vois pas du tout comment construire la requête (il faut que la modif ne soit que sur cette appli la, de ce projet la)

Merci d'avance pour votre aide car je galère un peu (je continue de chercher de mon coté évidement)