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) :
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.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
Enfin mes requêtes avec commentaire :
Ma première question :
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;
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)
Partager