slicing vez em Oracle / SQL
-
22-08-2019 - |
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!
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.