sql : group by et order by ... - Programmation
Marsh Posté le 24-04-2001 à 11:07:19
Essaye tj ça : "ORDER BY id DESC, date DESC", on ne sais jamais mais dans la logique ça doit tourné...
Marsh Posté le 24-04-2001 à 11:09:13
j'ai teste ausi mais ca donne pas le resultat voulu ...
Marsh Posté le 24-04-2001 à 11:26:09
tu veux faire quoi exactement, parce que là, c'est pas clair du tout
Marsh Posté le 24-04-2001 à 11:29:38
ouai pas clair du out
Marsh Posté le 24-04-2001 à 11:33:04
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
[edit]--Message édité par wouatouwouatou--[/edit]
Marsh Posté le 24-04-2001 à 11:36:30
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.
Marsh Posté le 24-04-2001 à 11:45:50
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
Marsh Posté le 24-04-2001 à 11:47:15
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.
Marsh Posté le 24-04-2001 à 11:50:02
c'est pas un order by date desc, id desc???
Tu veux bien trier par date PUIS par id???
Marsh Posté le 24-04-2001 à 12:12:17
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
Marsh Posté le 24-04-2001 à 12:24:46
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.
Marsh Posté le 24-04-2001 à 13:30:54
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
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 ...
[edit]--Message édité par wouatouwouatou--[/edit]
Marsh Posté le 24-04-2001 à 13:34:16
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.
Marsh Posté le 24-04-2001 à 13:35:26
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
Marsh Posté le 25-04-2001 à 12:54:03
Un fait nouveau..
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
P.S: J'en ai marre... :cry:
Marsh Posté le 25-04-2001 à 13:33:02
Salut
c'est triste hein ?
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]
Marsh Posté le 25-04-2001 à 13:50:48
je vais essaye ca .. mais ca ressemble au truc donne plus haut par ddr555
Marsh Posté le 25-04-2001 à 14:06:18
ddr555 a écrit a écrit : 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 ![]() |
t'as carrément raison !
Y sont trop ouf des Chef de projet !
Y z'était pas commerciaux avant
Marsh Posté le 25-04-2001 à 14:12:21
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
Marsh Posté le 25-04-2001 à 15:47:40
Mais.. chef de projet c pas un passage obligé pour nous
Au fait, ca marche ton truc thegti !!!
Marsh Posté le 25-04-2001 à 16:02:30
c'était mon idée, mais j'avais pas eu le temps d'optimiser ...
Marsh Posté le 25-04-2001 à 17:43:23
ouais.. c bien ce ke je pensais..
Mais la forme etait differente, alors...
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 ?
Marsh Posté le 25-04-2001 à 17:54:40
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 ?
Marsh Posté le 25-04-2001 à 18:19:51
ben... je lui ai mis la pression..
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 *
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 ??
Marsh Posté le 25-04-2001 à 21:58:50
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
Marsh Posté le 26-04-2001 à 08:58:10
Arfff !!!!!
wouatouwouatou> Il es trop fot ton chef de projet !
Marsh Posté le 26-04-2001 à 10:11:42
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+
Marsh Posté le 26-04-2001 à 11:33:31
oki.. merci de ces conseils..
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 ?
Marsh Posté le 26-04-2001 à 12:53:14
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 ...
Marsh Posté le 26-04-2001 à 18:04:20
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
Marsh Posté le 24-04-2001 à 11:02:44
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...
---------------
"C'est le boulot qu'on ne commence jamais qui est le plus long à terminer"