|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | |||||
|
Membre actif
![]() Inscription : avril 2007 Messages : 483 ![]() |
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 :
un exemple de données (pour une seule appli, données séparées par un pipe) : Citation:
Enfin mes requêtes avec commentaire : Code :
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) |
|||||
|
|
00
|
|
|
#2 | ||
|
Membre émérite
![]() Inscription : août 2008 Messages : 835 ![]() |
Salut,
Il serait plus simple dans ta requete, pour exclure le premier et le dernier enregistrement de procéder comme ça : Code :
Tu exclues ensuite facilement la première et la dernière ligne. En passant, pour tes alias évite les mots réservés comme day et hour dans tes requêtes, ça coute pas cher |
||
|
|
00
|
|
|
#3 | |
|
Membre actif
![]() Inscription : avril 2007 Messages : 483 ![]() |
pourrais tu m'expliquer ce que fais la requête (surtout la partie modifiée) car je suis encore débutant en sql oracle (les deux requêtes que j'ai montré ne sont pas entièrement issues de moi ^^")
J'aimerais comprendre ce qu'elle fait exactement avant de l'utiliser (également pour l'expliquer dans la doc). De plus, lorsque je l'exécute, oracle indique l'erreur suivante : Citation:
Code :
row_number(appstatus) OVER (partition BY appname, projname ORDER BY datestatus) AS rang, J'ai recompté les parenthèses et il y a le bon nombre ... Merci d'avance |
|
|
|
00
|
|
|
#4 |
|
Membre émérite
![]() Inscription : août 2008 Messages : 835 ![]() |
Ah oui, j'ai fait une erreur, row_number() n'attend rien entre les parenthèses.
Le copier/coller, c'est mal Donc, la ligne devient : Code :
row_number() OVER (partition BY appname, projname ORDER BY datestatus) AS rang, |
|
|
00
|
|
|
#5 |
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 276 ![]() |
|
|
|
00
|
|
|
#6 |
|
Membre émérite
![]() Inscription : août 2008 Messages : 835 ![]() |
Le tutoriel que t'a indiqué skuatamad devrait suffire.
On va quand même expliquer brièvement la sous requete. On sélectionne les champs de la table statsappli normalement, en ajoutant deux champs 'rang' et 'nb_occurences'. rang est donné par la fonction row_number(), qui 'numérote' tes enregistrements selon une notion de groupe (PARTITION BY appname, projname) et d'ordre (ORDER BY datestatus). nb_occurences indique le nombre d'occurences d'un couple appname/projname, et est donnée par la fonction count(*) over (PARTITION BY appname, projname). Ce champs va donc t'indiquer le rang maximum que peut avoir un enregistrement pour un couple appname/projname. En utilisant ces deux informations dans la requête principale, on exclue facilement les premiers et derniers enregistrements (WHERE rang > 1 AND rang < nb_occurences). |
|
|
00
|
|
|
#7 |
|
Membre actif
![]() Inscription : avril 2007 Messages : 483 ![]() |
En effet le tuto m'a aidé à comprendre la sous requête.
Par contre l'exécution de la requête ne me retourne pas juste le 1er et le dernier enregistrement de chaque groupe mais tous les enregistrements du couple projet / application en enlevant le 1er et le dernier de tous les enregistrements concernés. J'ai essayé un ou deux trucs comme Code :
WHERE rang = 1 OR rang = nb_occurences |
|
|
00
|
|
|
#8 | |
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 276 ![]() |
Citation:
Code :
WHERE appname='nom_appli' AND projname='nom_projet' |
|
|
|
00
|
|
|
#9 | |
|
Membre actif
![]() Inscription : avril 2007 Messages : 483 ![]() |
Citation:
|
|
|
|
00
|
|
|
#10 | ||
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 276 ![]() |
Ben si tu selectionnes un couple particulier de (appname, projname) dans la sous-requête, forcément la requête finale ne contiendra que 2 lignes.
Si tu retires cette clause where, tu auras 2 lignes par couple (appname, projname). [EDIT] Citation:
Citation:
|
||
|
|
00
|
|
|
#11 | ||
|
Membre actif
![]() Inscription : avril 2007 Messages : 483 ![]() |
ah oui d'accord.
Ce que je veux ce n'est pas 2 lignes par couple mais deux ligne par groupe de valeur du champ appstatus. Pour illustrer si je reprends mon exemple : Citation:
mais je n'y arrive pas ... EDIT En fait ce que je veux c'est, par exemple, modifier la valeur de compte pour les lignes Citation:
Je fais cela en php derrière : liste des premiers enregistrements de chaque groupe (donc ceux dont les id sont 1, 20, 50, 80 et 120) et en cliquant sur un bouton, j'envoie en paramètre le nom de l'appli de la ligne, le nom du projet, et l'id de la ligne. Je veux ensuite récupérer l'id de la dernière ligne du groupe dont j'ai sélectionné la ligne (exemple, si j'ai pris la ligne avec l'id 20, je récupère l'id 40) et le modifie le champ compte (qui vaut 1) de toutes les lignes entre (ayant le même nom d'appli et de projet) pour le passer à zero. Il y a peut être plus simple (pour si vous avez compris ce que je souhaite faire) et si c'est le cas merci de m'indiquer comment faire car je ne vois pas trop ... (je rappele que je suis débutant en sql oracle ... ) |
||
|
|
00
|
|
|
#12 | |||||
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 276 ![]() |
J'ai nommé les applis / projets pour que ce soit plus clair (je mme doute que plusieurs applis peuvent appartenir au même projet ou l'inverse mais bon ça simplifie)
Citation:
Citation:
Citation:
Code :
|
|||||
|
|
00
|
|
|
#13 | |
|
Membre actif
![]() Inscription : avril 2007 Messages : 483 ![]() |
non non l'extrait que je t'ai fourni était avec le même nom d'appli et de projet partout
j'ai juste épuré en enlevant toutes les autres applis de la table et tous les autres projets et en mettant un nom simplifié (c'est vrai que j'aurais pu mettre le même nom dans les requêtes pour plus de cohérence, désolé) EDIT Citation:
|
|
|
|
00
|
|
|
#14 |
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 276 ![]() |
Alors quelle est ta notion de groupe ?
[EDIT] Comment fais tu pour ne sélectionner que les id 20,30,40? |
|
|
00
|
|
|
#15 |
|
Membre actif
![]() Inscription : avril 2007 Messages : 483 ![]() |
ma notion de groupe (c'est vrai que je m'exprime mal) c'est en fait groupé selon la valeur de appstatus.
si tu reprends mon tout premier extrait, chaque "groupe" est séparé par un saut de ligne (il y a donc 5 groupes, en considérant la dernière ligne toute seule comme un groupe) |
|
|
00
|
|
|
#16 | |
|
Membre actif
![]() Inscription : avril 2007 Messages : 483 ![]() |
Citation:
j'ai juste à ajouter la sélection de l'id dans les deux requêtes en fait Il aura fallu une 12aine de post pour que je m'en rende compte ... je crois que je cherche trop de complication ... Je reposterai si en fait ce n'est pas bon mais ca devrait le faire en fait. Merci pour votre temps passé pour rien sur mon post |
|
|
|
00
|
|
|
#17 | ||
|
Membre émérite
![]() Inscription : août 2008 Messages : 835 ![]() |
Ok, je crois que j'ai fini par comprendre ce que tu voulais
![]() Code :
|
||
|
|
00
|
|
|
#18 |
|
Membre actif
![]() Inscription : avril 2007 Messages : 483 ![]() |
à peine,
à la place de Code :
WHERE appstatus = suivant AND appstatus = precedent Code :
WHERE (appstatus = suivant AND appstatus <> precedent OR appstatus <> suivant AND appstatus = precedent) |
|
|
00
|
|
|
#19 |
|
Membre émérite
![]() Inscription : août 2008 Messages : 835 ![]() |
Ok, donc j'avais pas tout à fait compris, ma requête était faite pour retourner seulement les enregistrements entre le premier et le dernier, et non pas seulement le premier et le dernier.
La condition serait donc plutot : Code :
WHERE (appstatus <> precedent OR appstatus <> suivant) Ta condition fonctionne car tu n'as pas de groupe de seulement deux lignes, donc lorsque appstatus <> precedent, necessairement appstatus = suivant. Mais si tu as un groupe de 2 enregistrements, il ne te l'affichera pas. |
|
|
00
|
|
|
#20 |
|
Membre actif
![]() Inscription : avril 2007 Messages : 483 ![]() |
nan en fait je vais récupérer le 1er et le dernier seulement, et je ferais un update avec dans la clause where
Code :
WHERE appname=nom_appli AND projname=nom_projet AND id BETWEEN id_début AND id_fin |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com