Question

J'ai une table Oracle à grande ish contenant des lignes représentant des unités de travail, avec des colonnes pour l'heure de début et de fin, en plus d'autres méta-données.

Je dois générer des graphiques d'utilisation de ces données, compte tenu des critères de filtrage arbitraires et une période de déclaration. Par exemple, me montrer un graphique de l'ensemble des emplois d'Alice pour la période de 24 heures à partir de mardi dernier à 7h00. Chaque ligne DB empiler verticalement dans le graphique.

Je pourrais le faire dans un langage de haut niveau en interrogeant toutes les lignes potentiellement pertinentes, le temps de trancher chacun dans des seaux de 1 minute et le résultat graphiquement. Mais est-il un moyen efficace de faire ce découpage temporel dans SQL? Ou est-il une technologie Oracle existante qui fait cela?

Merci!

Était-ce utile?

La solution

En ce qui concerne l'obtention des données, vous pouvez utiliser « groupe par » et « tronquer » pour couper les données dans des intervalles de 1 minute. par exemple:

SELECT user_name, truncate(event_time, 'YYYYMMDD HH24MI'), count(*)
FROM job_table
WHERE event_time > TO_DATE( some start date time)
AND user_name IN ( list of users to query )
GROUP BY user_name, truncate(event_time, 'YYYYMMDD HH24MI') 

Cela vous donnera des résultats comme ci-dessous (en supposant qu'il y a 20 lignes pour alice entre 8,00 et 8,01 et 40 lignes entre 8,01 et 8,02):

Alice  2008-12-16 08:00   20
Alice  2008-12-16 08:01   40

Autres conseils

Votre meilleur pari est d'avoir une table (un temporaire généré à la volée serait bien si la tranche de temps est dynamique) puis rejoindre contre cela.

Cela devrait le faire assez bien. Il se décomposera à la minute (1/1440 d'un jour).

SELECT 
  to_char(Times.time,'hh24:mi'),
  count(*)   
FROM   
  (SELECT
     time
   FROM  
     dual
   WHERE 
     1=2 
   MODEL 
     dimension by ( 0 as key )
     measures     ( sysdate -1 as time )
     rules upsert ( time[ for key from 0 to 1 increment (1/1440) ] = sysdate-1 + cv(key)) ) Times,
  job_table
WHERE 
  begintime <= Times.time 
AND 
  endtime > Times.time 
AND
  user_name = 'Alice'
GROUP BY 
  Times.time 
ORDER BY
  Times.time

Je suis sûr qu'il ya un moyen plus rapide pour ce faire, mais c'est le meilleur que je peux trouver. Espérons que cela aide.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top