Problème pour une requête SELECT [SQL 2005] - SQL/NoSQL - Programmation
Marsh Posté le 23-06-2007 à 14:52:16
Salut, fais voir déjà ce que tu as fait.
Déjà pour les 2 premières colonnes tu dois avoir :
Code :
|
Marsh Posté le 23-06-2007 à 17:13:16
Coucou
Bin voici mon code (qui fonctionne) :
Code :
|
Je le trouve hyper lourd
Donc si qqn a une idée
Marsh Posté le 25-06-2007 à 09:52:02
Essaie de comprendre ce que fait cet exemple :
Code :
|
Et tu auras ta réponse.
Marsh Posté le 28-06-2007 à 23:42:15
Coucou Magic
J'ai beau me creuser la tête, j'ai du mal à comprendre où tu veux en venir avec ton CROSS JOIN.
Ta requête me retourne en 2ème colonne un nombre astronomique (puisque c'est un CROSS JOIN), et la 3ème retourne 100 tout le tps (logique...).
Je ne comprends pas comment je pourrais utiliser le CROSS JOIN dans mon cas
Merci bien si tu peux m'éclairer
Marsh Posté le 29-06-2007 à 09:14:03
pourtant moi ça marche... t'es sûr que tu fais bien des count(distinct pk) ?
Marsh Posté le 30-06-2007 à 11:22:38
Coucou Magic
Bin j'ai recopié texto ta requête. La 1ère colonne est OK, mais la 2ème me renvoit toujours 100. C'est logique d'ailleurs :
u1 = u2 => (count(DISTINCT u1.id)) = (count(DISTINCT u2.id))
Qu'as-tu essayé de faire avec ton CROSS JOIN ?
Merci bien en tout cas
Marsh Posté le 30-06-2007 à 14:27:19
oui, et chez moi ça marche.
count(distinct u1.id) => retourne le nombre de u1.id différents par pays_id.
count(distinct u2.id) => retourne le nombre de u2.id différents dans la table uti, quelle que soit la valeur de pays_id
en gros :
uti
|
la requête doit retourner
|
Marsh Posté le 30-06-2007 à 14:32:21
Sur ma base de test :
Code :
|
|
Marsh Posté le 30-06-2007 à 15:59:10
Ah oui effectivement ça marche ton cocode
Bin je vais l'étudier, et voir la relation avec mon problème, cas réel. Merci bcp à toi en tout cas !
Edit : je m'étais trompé en recopiant ta requête et en l'applicant à mon cas... en fait ça marche
Par contre, côté perf... bof. Ta requête mets plus d'une minute alors que mon énorme code mets qq centièmes de secondes.
Bin... le CROSS JOIN ça fait mal sur ma table de 2000 lignes.
En tout cas, merci beaucoup ! J'ai tjs pas compris comment ton CROSS JOIN produit le bon résultat, mais ça peut toujours servir
Marsh Posté le 14-07-2007 à 01:04:55
à mon avis, c'est parceque tu produis un mauvais résultat que ton cross join est lent.
parceque le cross join c'est un bête produit cartésien, c'est le type de jointure le plus rapide à produire normalement.
bon, ensuite moi je fais des distinct sur la PK, donc je n'accède pas aux données à proprement parler. si tu commences à taper dans les champs de ta table qui ne sont pas indexés, effectivement ça risque d'être très moyen niveau perfs...
Marsh Posté le 14-07-2007 à 01:14:19
le type float c'est beurk
Marsh Posté le 14-07-2007 à 01:23:02
damned, c'est vrai qu'il est pourri SQL Server 2005 avec un cross join
Bon, autre solution vraiment toute bête et ultra rapide :
Jeu de test :
Code :
|
Le code :
Code :
|
Sortie :
|
PS : J'utilise une transaction afin de pouvoir utiliser "with(xlock)" qui permet de coller un verroux exclusif sur la table durant ma transaction. Ainsi, je suis sûr que ma seconde requête va porter sur le même nombre de lignes que celles comptées dans la requête qui a posé le verroux. Le verrou est abandonné lorsque la transaction se termine.
Pour 1 million de lignes, le résultat met 3 secondes à s'afficher.
Marsh Posté le 14-07-2007 à 01:38:32
il cherche à faire quoi alors ?
j'affiche bêtement pour chaque valeur de "pays_id" le nombre d'occurences dans ma table ainsi que le pourcentage que cela représente
ps : changé mon test avec 1 000 000 lignes pour avoir un résultat moins instantané
Marsh Posté le 14-07-2007 à 01:40:11
pourcentage par rapport aux max(nb_mesg) et non pas par rapport au total
edit : je suis pénible, je sais. Déformation professionnelle
Marsh Posté le 14-07-2007 à 01:45:55
je te le refais avec la même structure vu que tu vois pas le raport, ce sera peut-être plus clair
En fait, quand on regarde bien, je fais rigoureusement la même chose sauf que je ne passe pas par une table temporaire inutile et j'évite les valeurs anormales via mon lock
Code :
|
2 minutes 40 secondes pour générer le jeu de test
Code :
|
1 seconde (c'est encore mieux qu'avec des int )
|
Marsh Posté le 14-07-2007 à 01:50:31
|
cherche l'erreur
Marsh Posté le 23-06-2007 à 13:57:17
Bonjour

Voici le problème :
J'ai une table "Chat" avec 2 colonnes, "Pseudo" et "message". Lorsque qu'une personne laisse un message, une ligne est ajoutée à la table. Par exemple, la table est comme ceci :
-------------------------------------------
Pseudo, Message
-------------------------------------------
"Robert", "salut"
"Rémi", "ava ?"
"Robert", "oui"
"Susan", "coucou"
Ce que je voudrais, c'est établir des statistiques en faisant une requête qui me retourne ceci :
-------------------------------------------
Pseudo, Nb_msg, Percentage
-------------------------------------------
"Robert", 2, 100%
"Rémi", 1, 50%
"Susan", 1, 50%
Vous voyez ? J'y suis arrivé, mais en faisant une usine à gaz... alors si qqn a une idée pour une tite requête simple
Mici bien
Message édité par Roodie le 23-06-2007 à 13:58:52