Aide pour une requete "nombre de connexion par tranche horaire"

Aide pour une requete "nombre de connexion par tranche horaire" - SQL/NoSQL - Programmation

Marsh Posté le 17-06-2003 à 11:15:27    

Salut,
 
j'explique mon problème
J'ai une table de logs (à chaque fois qu'un utilisateur se connecte à une certaine application, la table est renseignée avec son nom de login avec la date et heure)
 
J'aimerais faire une requete qui liste par tranche horaire de deux heures le nombre de connexion qui ont lieu par exemple :
 
 
date  | 00h00-02h00 | 02h00-04h00 | 04h00-06h00 | ....
16/06      5              8             3          8
17/06      4              9             7          4
 
Mais j'ai aucune idée de la requête ???
Ou avez vous une astuce ??
 
Merci de votre aide :jap:    

Reply

Marsh Posté le 17-06-2003 à 11:15:27   

Reply

Marsh Posté le 17-06-2003 à 11:45:01    

Salut!
J'ai pas testé pour savoir si ça marche mais il doit falloir écrire un truc du style suivant :
 
SELECT [Nbre de log]
FROM Ticket_incident
WHERE [Heure] BETWEEN Heure de debut AND Heure de fin;
 
Apres je sais pas avec quoi tu travailles mais tu peux peut etre
faire une loop et incrementer les variables Heure de debut et de fin de 2 à chaque fois...
 
@+
Seb

Reply

Marsh Posté le 17-06-2003 à 12:00:34    

Cette requette est fait dans une page asp (connexion sous oracle)
et biensur le résultat est mis dans un tableau
 
C'est ce que je pensais faire mais je dois faire une requete par tranche horaire alors ??

Reply

Marsh Posté le 17-06-2003 à 13:17:32    

Il existe peut être un moyen de faire ça avec une seule requête mais je vois pas comment se serait possible :??:  
En tout cas si tu trouves la solution ça m'interesse
bon courage
sinsé

Reply

Marsh Posté le 17-06-2003 à 13:43:32    

C dépend des fonctions de manipulation d'heure qui sont disponibles.
Si tu en as une qui te permet d'extraire l'heure, je pense que tu pourras écrire : GROUP BY (HOUR(heure) / 2)

Reply

Marsh Posté le 17-06-2003 à 14:05:23    

Bon j'ai pas d'Oracle sous la main, mais ...
 
... mais si tu arrives à trouver une fonction  
qui arrondi les heures 13H30 -> 13H appelons là ARROND
 
 
alors avec un truc comme ça j'y arriverai ...
 
select madate, sum (decode((ARROND(monheure) MOD 2) * 2,0,1,0),
sum (decode((ARROND(monheure) MOD 2) * 2,2,1,0),
sum (decode((ARROND(monheure) MOD 2) * 2,4,1,0),
...
sum (decode((ARROND(monheure) MOD 2) * 2,22,1,0)
from matable
group by madate
 
ex : 17H30 => ARROND(17H30) => 17H
 
17H MOD 2 => 8
8 * 2 => 16
 
sum (decode((ARROND(monheure) MOD 2) * 2,16,1,0) => +1 sur
le creneau 16-18H
 
Bon c juste une idée en passant  :sarcastic:  
 
 

Reply

Marsh Posté le 17-06-2003 à 15:29:21    

Salut vttman2,
elle correspond à quoi ta fonction decode ?

Reply

Marsh Posté le 17-06-2003 à 15:43:57    

-BigFoot- a écrit :

Salut vttman2,
elle correspond à quoi ta fonction decode ?


 
benh le decode c une instruction Oracle style
 
decode(monchamp, 15,'quinze',16,'seize','?')
 
Dans cet exemple  
si monchamp contient le valeur 15 l'instruction  
decode renvoit 'quinze'
si monchamp contient le valeur 16 l'instruction  
decode renvoit 'seize'
Sinon elle renvoit '?'
 

Reply

Marsh Posté le 17-06-2003 à 15:46:30    

oki
merci pour ta réponse :jap:

Reply

Marsh Posté le 17-06-2003 à 16:00:01    

Essaye cela:
 
SELECT JOUR,
       SUM(A),
       SUM(B),
       SUM(C),
       SUM(D),
       SUM(E),
       SUM(F),
       SUM(G),
       SUM(H),
       SUM(I),
       SUM(J),
       SUM(K),
       SUM(L)
FROM (SELECT JOUR,  
             DECODE(TRANCHE,0,SUM(TOTAL)) A,
             DECODE(TRANCHE,2,SUM(TOTAL)) B,
             DECODE(TRANCHE,4,SUM(TOTAL)) C,
             DECODE(TRANCHE,6,SUM(TOTAL)) D,
             DECODE(TRANCHE,8,SUM(TOTAL)) E,
             DECODE(TRANCHE,10,SUM(TOTAL)) F,
             DECODE(TRANCHE,12,SUM(TOTAL)) G,
             DECODE(TRANCHE,14,SUM(TOTAL)) H,
             DECODE(TRANCHE,16,SUM(TOTAL)) I,
             DECODE(TRANCHE,18,SUM(TOTAL)) J,
             DECODE(TRANCHE,20,SUM(TOTAL)) K,
             DECODE(TRANCHE,22,SUM(TOTAL)) L  
      FROM (SELECT TO_CHAR(LADATEHEURE,'DD/MM') JOUR,
                   TRUNC(TO_CHAR(LADATEHEURE,'HH24')/2)*2 TRANCHE,
                   COUNT(*) TOTAL
            FROM TABLELOG
            GROUP BY TO_CHAR(LADATEHEURE,'DD/MM'),
                     TRUNC(TO_CHAR(LADATEHEURE,'HH24')/2)*2)
      GROUP BY JOUR, TRANCHE)
GROUP BY JOUR;
 
Les colonnes A à L correspondant aux tranches de la journée par 2 heures (12 tranches donc).

Reply

Marsh Posté le 17-06-2003 à 16:00:01   

Reply

Marsh Posté le 17-06-2003 à 16:48:18    

[:c4_exodusss]  
Merci pour votre aide à tous et en particulier à Agagax
J'ai essayé ta solution et c'est exactement ce que je veux
[:flclsd] [:flclsd] [:flclsd]


Message édité par -bigfoot- le 17-06-2003 à 16:54:13
Reply

Marsh Posté le 17-06-2003 à 20:28:55    

J'ai le droit de vomir ? :D
 
Bon, en bref, vouloir ramener ça en plusieurs colonnes est pas bien malin, puisque les deux axes sont dérivés de la même variable. Il n'y a donc qu'une colonne à retourner, et la requête est un peu plus claire :
 

select sum(cnx_id), to_char(round(to_number(to_char(cnx_dte, 'HH24')) / 2), 0) * 2) || 'h00-' || to_char(round(to_number(to_char(cnx_dte, 'HH24')) / 2) + 1, 0) * 2) || 'h00', to_char(dte_cnx, 'DD/MM/YYYY')
from connections
group by to_char(round(to_number(to_char(cnx_dte, 'HH24')) / 2), 0) * 2) || 'h00-' || to_char(round(to_number(to_char(cnx_dte, 'HH24')) / 2) + 1, 0) * 2) || 'h00', to_char(dte_cnx, 'DD/MM/YYYY')


 
Simple comme choux.


Message édité par MagicBuzz le 17-06-2003 à 20:29:44
Reply

Marsh Posté le 18-06-2003 à 11:09:42    

MagicBuzz a écrit :

J'ai le droit de vomir ? :D
 :heink:  
 
Bon, en bref, vouloir ramener ça en plusieurs colonnes est pas bien malin, puisque les deux axes sont dérivés de la même variable. Il n'y a donc qu'une colonne à retourner, et la requête est un peu plus claire :
 

select sum(cnx_id), to_char(round(to_number(to_char(cnx_dte, 'HH24')) / 2), 0) * 2) || 'h00-' || to_char(round(to_number(to_char(cnx_dte, 'HH24')) / 2) + 1, 0) * 2) || 'h00', to_char(dte_cnx, 'DD/MM/YYYY')
from connections
group by to_char(round(to_number(to_char(cnx_dte, 'HH24')) / 2), 0) * 2) || 'h00-' || to_char(round(to_number(to_char(cnx_dte, 'HH24')) / 2) + 1, 0) * 2) || 'h00', to_char(dte_cnx, 'DD/MM/YYYY')


 
Simple comme choux.
 :sleep:  
 

Reply

Marsh Posté le 18-06-2003 à 11:12:11    

Bah c'est la mise en forme au format des heures qui est longue, la requête elle-même est toute petite ;)

Reply

Marsh Posté le 18-06-2003 à 15:02:28    

MagicBuzz a écrit :

J'ai le droit de vomir ? :D
 
Bon, en bref, vouloir ramener ça en plusieurs colonnes est pas bien malin, puisque les deux axes sont dérivés de la même variable. Il n'y a donc qu'une colonne à retourner, et la requête est un peu plus claire :
 

select sum(cnx_id), to_char(round(to_number(to_char(cnx_dte, 'HH24')) / 2), 0) * 2) || 'h00-' || to_char(round(to_number(to_char(cnx_dte, 'HH24')) / 2) + 1, 0) * 2) || 'h00', to_char(dte_cnx, 'DD/MM/YYYY')
from connections
group by to_char(round(to_number(to_char(cnx_dte, 'HH24')) / 2), 0) * 2) || 'h00-' || to_char(round(to_number(to_char(cnx_dte, 'HH24')) / 2) + 1, 0) * 2) || 'h00', to_char(dte_cnx, 'DD/MM/YYYY')


 
Simple comme choux.


 
Sérieusement, à quoi va lui servir ton post ?
 
Premièrement, tu ne réponds pas à sa question qui est d'afficher les comptages sur plusieurs colonnes correspondant aux plages horaires d'une journée pour ensuite l'inclure dans un tableau dimensionné à cet effet.
S'il avait voulu le faire sur une colonne, je pense qu'il n'aurait pas eu besoin de poster ici...
 
Deuxièmement, ta requête est incorrecte.
Que vas tu obtenir un sum(cnx_id), hein ? il s'agit d'un comptage du nombre de lignes !  
De plus il y a une coquille dans la syntaxe de ta deuxième colonne.
Quant à la clarté de la présentation de ta requête, je laisse le soin aux lecteurs de juger.
 
Troisièmement, ce que j'ai écrit n'est qu'une façon de faire. Il y en a probablement d'autres.  
La requête peut être optimisée. J'aurais pu aussi nommer clairement les colonnes par "00h00-02h00"...
On pourrait aussi très bien utiliser du PL, etc...
 
Enfin pour conclure, continue à vomir sur ceux qui prennent le temps de répondre à ceux qui cherchent de l'aide...
J'apprécie de venir sur ce forum mais je n'ai pas beaucoup le temps de lire et d'intervenir, et ce n'est pas ce genre de comportement puéril qui va m'inciter à le faire plus souvent.
Ni moi, ni ceux qui sont de passage sur ce forum.

Reply

Marsh Posté le 18-06-2003 à 15:18:51    

Très franchement, y'a beaucoup de gens qui utilisent le sgbd pour faire la mise en page ?
C'est pas le boulot du sgbd, donc la répartition en autant de colonnes qu'il y a de tranches horraire, très franchemement je le laisse à l'appli de reporting qui bosse à partir de la requête...
 
Deplus, ouais, j'ai laissé deux coquilles. Désolé de pas avoir oracle chez moi.
 
Et je ne vois pas ce qu'il y a de mal à présenter une autre solution (ma requête est deplus extrêment plus simple, et bien plus propre).
 
Pour finir, je te laisse la réécrire de façon plus sexy, perso je vois pas comment la rendre plus sexy, j'y peut rien si à cause de la présentation la déclaration du champ fait deux lignes... C'est peut-être aussi pour ça que je bosse toujours sur 21", pour pas être emmerdé avec des retours à la ligne en cas de requêtes complexes...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed