2008-09-08 25 views
1

Je dois trouver une analyse des événements simultaneus, quand il n'y a que l'heure de début et la durée de chaque événement.Appels simultanés de CDR

Détails

J'ai un enregistrement standard de détail d'appel CDR, qui contient entre autres:

  • calldate (timedate de chaque appel commence
  • durée (int, secondes de durée d'appel)
  • canal
  • (une chaîne)

Ce que je dois trouver, c'est une sorte d'analyse des appels simultanés à chaque seconde, pour une période donnée. Par exemple, un graphique des appels simultanés que nous avons eu hier.

(Le problème est le même si nous avons des journaux visiteurs avec la durée sur un site Web et qui souhaitent obtenir des clients simultanés pour un groupe de pages web)

Quelle serait votre Algoritm être?

Je peux itérer sur des enregistrements dans la période donnée et remplir un tableau, où chaque segment du tableau correspond à 1 seconde dans la période globale. Cela fonctionne et semble être rapide, mais si la durée est grande (disons 1 an), j'aurais besoin de beaucoup de mémoire (3600x24x365x4 octets ~ 120 Mo aprox).

Ceci est pour une application interactive basée sur le Web, donc mon empreinte mémoire devrait être assez petite.

Modifier

En même temps, je veux dire tous les appels sur une seconde donnée. Deuxième serait mon unité minimum. Je ne peux pas utiliser quelque chose de plus grand (heure par exemple) parce que tous les appels pendant une heure n'ont pas besoin d'être tenus en même temps.

Répondre

1

Je voudrais implémenter cela sur la base de données. En utilisant une clause GROUP BY avec DATEPART, vous pourriez obtenir une liste d'appels simultanés pour la période de temps que vous voulez, par seconde, minute, heure, peu importe. Sur le web, il suffit d'afficher l'histogramme renvoyé par la requête.

0

@ eric-z-beard: J'aimerais vraiment pouvoir implémenter cela sur la base de données. J'aime votre proposition, et même si cela semble mener à quelque chose, je ne comprends pas tout à fait. Pourriez-vous élaborer? Rappelez-vous que chaque appel doit durer plusieurs secondes et que chaque seconde doit compter. Si vous utilisez DATEPART (ou quelque chose comme ça sur MySQL), quelle seconde devrait être utilisée pour le GROUP BY. Voir note sur simultaneus. En élaborant cela, j'ai trouvé un moyen de le résoudre en utilisant une table temporaire. Temp En supposant contient toutes les secondes de tstart à TEND, je pouvais faire

SELECT temp.second, count(call.id) 
FROM call, temp 
WHERE temp.second between (call.start and call.start + call.duration) 
GROUP BY temp.second 

Ensuite, comme l'a suggéré, l'application Web doit utiliser comme un histogramme.

0

Vous pouvez utiliser une table de nombres statiques pour beaucoup de trucs SQL comme celui-ci. La table Numbers contient simplement des entiers de 0 à n pour n comme 10000.

Ensuite, votre table temporaire ne doit jamais être créé et est plutôt une sous-requête comme:

SELECT StartTime + Numbers.Number AS Second 
FROM Numbers 
0

Vous pouvez créer la table 'simultaneous_calls' avec 3 champs:

yyyymmdd Char(8), 
day_second Number, -- second of the day, 
count   Number -- count of simultaneous calls
Votre service Web peut prendre la valeur « count » de cette table et faire des statistiques.

La table des appels simultanés sera remplie par un programme batch qui sera démarré tous les jours après la fin de la journée.

En supposant que vous utilisez Oracle, le lot peut lancer une procédure PL/SQL qui effectue les opérations suivantes:

  1. Ajoute table avec 24 * 3600 = 86400 enregistrements pour chaque seconde de la journée, avec le nombre par défaut » "value = 0.
  2. définit les« s curseur pour la requête:

Select to_char(calldate, 'yyyymmdd')    yyyymmdd, 
     (calldate - trunc(calldate)) * 24 * 3600 starting_second, 
     duration            duration 
From cdrs 
Where cdrs.calldate >= Trunc(Sysdate -1) 
    And cdrs.calldate
  1. Itère le curseur pour incrémenter 'day_cdrs champ compter' f ou les secondes de l'appel:
 
For cdr in day_cdrs 
Loop 
    Update simultaneos_calls 
    Set  count = count + 1 
    Where yyyymmdd = cdr.yyyymmdd 
     And day_second Between cdr.starting_second And cdr.starting_second + cdr.duration; 
End Loop; 
Questions connexes