| |||||
| Dernière réponse | |
|---|---|
| Sujet : sql : group by et order by ... | |
| omega2 | J'ai pas tout lus mais d'après ce que j'ai comrpis il faut faire un select table1.max(date) date1,table.date,table.id from table, table as table1 where table.id=table1.id order by date1,id,date |
| Aperçu |
|---|
| Vue Rapide de la discussion |
|---|
| omega2 | J'ai pas tout lus mais d'après ce que j'ai comrpis il faut faire un select table1.max(date) date1,table.date,table.id from table, table as table1 where table.id=table1.id order by date1,id,date |
| ddr555 | oui c'est normal, le temps varie en fonction de la charge serveur ( process qui tournent en permanence ) et en fonction des disques, de la présence des données dans le cache ...
pour te foutre les boules : les chefs de projet comme ça ont aussi une marque de fabrique pas cool du tout : tu peux être sur qu'il va charger à fond sur ton dos tout dérapage à ses supérieurs, sisi, C vrai ... |
| wouatouwouatou | oki.. merci de ces conseils.. :jap:
Mais j'ai encore une question... C'est ti normal ke pour la meme requete, le temps d'execution est different sur plusieurs essais ? Et si je suis tout seul a requeter le serveur, c normal dans ce cas ? |
| thegti | Salut
Avec des curseurs, faut voir si tu peut réduire le nombre de passes dans les tables En passant par des tables temporaires, tu peut y gagner pas mal aussi, au lieu de faire des sous-requêtes de la mort Par contre, sur des grosses tables, avec des indexs bien pensés, tu peut y gagner beaucoup Par exemple, pour ca: select a.id, a.date from table a, (select b.id, max(b.date) as maxdate from table b group by b.id) c where a.id=c.id order by c.maxdate desc Déjà faut faire un index sur les champs de jointure des tables concernées, donc ici un index sur id. Deuxième, dans la sous-requête, on a un group by id et un max(date), donc un index (id,date). Là déjà, normalement, tu dois gagner pas mal de temps, au détriment de la taille de la base de données Autre détail, tu peut faire des indexs clusterisés ou les index seront placés de facon contigu sur le disque, donc gagner encore un peu de perfs, enfin ca, ca dépend si tu sent que le disque dur du serveur rame ou pas, sinon c'est pas primordial a+ |
| drakkon | Arfff !!!!!
wouatouwouatou> Il es trop fot ton chef de projet ! :lol: :lol: :lol: |
| ddr555 | si c'est bien fait avec les curseurs, ça sera plus rapide, C sur ...
C bien un chef de projet pas technique du tout, je reconnais bien la marque caractéristique :D:D:D |
| wouatouwouatou | ben... je lui ai mis la pression.. :D
En fait, c paske telle kelle est la requete prend 14s... pour simplement sortir 380 lignes environs... Et je lui ai dit ke peut etre avec des curseurs et proc. stockee. ca irai plus vite... mais un peut etre seulement.. Alors il a dit : "J'ai une idee, et avec les curseurs... ca irait plus vite ?? parce que la ta requete est trop longue... " * Sans commentaire :D * Bref, moi j'sais meme pas si avec des curseurs ce serait mieux ou pas.. mais je pense ke oui ... Au fait, ma requete fait 7Ko... avec un tout ptit peu de commentaire (qq octets).. Enorme hein ?? |
| thegti | Bah je croyais que c'était tout en une seule requête, pas de curseur, pas de vue ...
Le chef de projet a changé de stratégie ? |
| wouatouwouatou | ouais.. c bien ce ke je pensais.. :D
Mais la forme etait differente, alors... :p Bref, en tout cas ca marche... mais c un peu long... sinon, comment on pourrait mettre ca en curseur ou vue?? Est ce une bonne idee ? |
| ddr555 | c'était mon idée, mais j'avais pas eu le temps d'optimiser ... |
| wouatouwouatou | Mais.. chef de projet c pas un passage obligé pour nous :D
Au fait, ca marche ton truc thegti !!! |
| ddr555 | Ce que je supporte pas, C les chefs de projet qui ont jamais fait de technique, ou qui était nuls ou qui ont oublié ce que c'était, et qui par la même cherchent à te mettre sur le dos la responsabilité du dérapage d'un projet dont tu n'es que le maillon final. Il est temps que je passe chef de projet moa :cry: |
| drakkon |
|
| wouatouwouatou | je vais essaye ca .. mais ca ressemble au truc donne plus haut par ddr555 |
| thegti | Salut
:cry: :cry: c'est triste hein ? :cry: :cry: Moi comme ca à chaud je ferais un truc comme ca: select a.id, a.date from table a, (select b.id, max(b.date) as maxdate from table b group by b.id) c where a.id=c.id order by c.maxdate desc [edit]--Message édité par thegti--[/edit] |
| wouatouwouatou | Un fait nouveau.. :D
Maintenant il me fo un ordre par date la plus recente... Mais groupées par id.. est-ce possible ? Jai fais un group by id suivi d'un order by la_date desc Mais ca marche pas... Ptet paske ds mon select ya plusieurs champs... autres ke l'id et la date... Jsuis obligé de mettre touts les champs de mon select pourle group by, sinon il aime pas :( Et je crois ke c ca ki fait foire le truc.. Une idee ? Eclairez ma lanterne plz... elle commence par etre usee :D P.S: J'en ai marre... :cry::cry: |
| ddr555 | une semaine de bourre ???
C pas beaucoup ... il faut compter en % du temps global du projet. quand tu arriveras à 300 % du temps prévu, tu pourras commencer à dire que t'es à la bourre :D |
| ddr555 | Change de boite !!! Travailler avec des cons pareils qui te disent y faut pas faire comme ça mais comme ça, C très lourd de travailler avec. |
| wouatouwouatou | en fait, ma 'table' est une requete assez lourde (2 sec).
Alors si je dois la lancer a chaque fois ca risque de faire lourd au final... surtout qu'elle se retrouvera en sous requete imbriquées et correlee... le pire de tout :( sinon, ben si ya pas moyen ... ben reste plus ka pleurer :cry: P.S: D'autant plus que la strategie bidon de pas vouloir de procedure stockee et de table temporaire complique qq peu la tache.. Vraiment ces chefs de projet.. ils devraient se pencher un peu plus sur les kestions techniques... en plus ils vous donnent des delais pas possibles !!!! Voila c t mon coup de gueule du jour... La jsuis a la bourre de plus d1 semaine :D... [edit]--Message édité par wouatouwouatou--[/edit] |
| ddr555 | il veut trier les lignes d'abord par la date maxi pour un id, donc obligé de passer par une auto-jointure, sinon les groupes seront pas bien ordonnés. |
| thegti | Salut
order by id desc, date desc ou order by id , date desc selon l'ordre que tu veut pour l'id Tu ne peut pas garder ton ordre initial des id en une passe |
| Fred999 | c'est pas un order by date desc, id desc???
Tu veux bien trier par date PUIS par id??? |
| ddr555 | oups, gourrage de bouton.
faut faire une requete où tu récupères la date max pour un groupe d'id, ensuite tu te sers de ça pour trier ta liste en n°1, puis tu tries par la date. bon, j'vais manger. si t'y arrives pas, j'te sors la requête complète. |
| ddr555 | select a.id,a.date,b.date
from table a,table b where a.id = b.id and b.date = ( select max(date) from table c where c.id = b.id |
| wouatouwouatou | au final on devrait obtenir des groupes d'id ordonnés par rapport a la date la plus recente du groupe... mais a l'interieur de chaque groupe les lignes doivent etre aussi ordonnées. |
| wouatouwouatou | ben... comme dans l'exemple... il me faudrait ordonner les lignes par date decroissante mais en tenant compte de l'id...
Pour chaque id, il faut ordonner par date decroissante. On a ainsi des lignes groupées par l'id. Puis ordonner les groupes ainsi formés par date decroissante (par rapport a la date la plus recente du groupe), mais en préservant l'ordre dans les groupes. J'sais pas si c plus clair ... mais j'espere que c mieux :D [edit]--Message édité par wouatouwouatou--[/edit] |
| drakkon | ouai pas clair du out |
| ddr555 | tu veux faire quoi exactement, parce que là, c'est pas clair du tout |
| wouatouwouatou | j'ai teste ausi mais ca donne pas le resultat voulu :(... |
| Bendes | Essaye tj ça : "ORDER BY id DESC, date DESC", on ne sais jamais mais dans la logique ça doit tourné... |
| wouatouwouatou | Encore un chtit pb.:
Je voudrais faire un regroupement du genre: Ordonner par date decroissante, les lignes regroupées par l'id. Exemple: id | Date | 1150 | 23/04/01 1150 | 22/04/01 1081 | 23/04/01 1081 | 23/04/01 1081 | 23/04/01 980 | 19/04/01 1030 | 18/04/01 Comment faire ca ? plzzz J'ai essaye un order by mais ca ordonne pas lesgroupes... Pi jai essayé aussi avec un group by sur l'id suivi d'un un order by sur la date, mais il me mais que c pas une expression group by sur l'id... :( |




