Pergunta

Eu tenho uma tabela do Oracle grande ish contendo linhas que representam unidades de trabalho, com colunas para tempo de início e fim, além de outras meta-dados.

Eu preciso gerar gráficos de uso de dados, dado alguns critérios de filtragem arbitrárias e um período de tempo de relatórios. Por exemplo, me mostre um gráfico de todos os postos de trabalho de Alice para o período de 24 horas começando na terça-feira às 7:00 am. Cada linha DB serão empilhados verticalmente no gráfico.

Eu poderia fazer isso em uma linguagem de alto nível, consultando todas as linhas potencialmente relevantes, tempo de cortar cada um em baldes de 1 minuto, e graficamente o resultado. Mas há uma maneira eficiente de fazer isso fatiamento tempo no SQL? Ou há uma tecnologia Oracle existente que faz isso?

Obrigado!

Foi útil?

Solução

Em termos de obter os dados, você pode usar 'grupo por' e ' truncar ' para cortar os dados em intervalos de 1 minuto. por exemplo:

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') 

Isto irá fornecer resultados como abaixo (assumindo que existem 20 linhas por Alice entre 8,00 e 8,01 e 40 linhas entre 8,01 e 8,02):

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

Outras dicas

Sua melhor aposta é ter uma tabela (uma forma temporária gerada em tempo real seria bom se o tempo-slice é dinâmico) e, em seguida, juntar-se contra isso.

Isso deve fazê-lo muito bem. Será quebra para o minuto (1/1440 de um dia).

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

Eu tenho certeza que é uma maneira mais rápida de fazer isso, mas este é o melhor que eu posso vir acima com. Espero que isso ajude.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top