RES: RES: [oracle_br] Re: SELECT chato!

2011-11-17 Por tôpico Milton Bastos Henriquis Junior

Boa tarde JL!

Muito obrigado pela contribuição... Ainda não consegui testar, pois a query 
exigiu mais espaço na TEMP, e eu não tenho a senha de SYSTEM para alterar o 
banco.
Já mandei uma solicitação pra equipe de infra, vamos ver se me respondem


Por enquanto, muito obrigado, assim que eu conseguir rodar a query eu respondo 
aqui pra vcs!

--
Milton Bastos
http://miltonbastos.com

De: oracle_br@yahoogrupos.com.br [mailto:oracle_br@yahoogrupos.com.br] Em nome 
de JLSilva
Enviada em: quinta-feira, 17 de novembro de 2011 14:16
Para: oracle_br@yahoogrupos.com.br
Assunto: Re: RES: [oracle_br] Re: SELECT chato!



Milton,
será que isto resolve?
gerei os grupos (intervalos de 15 minutos) e peguei os primeiros valores de 
cada grupo.

with interv_15min as
(
select trunc(data_inicial) + (rownum - 1)/24/60*15 inicio_interv, 
trunc(data_inicial) + (rownum)/24/60*15 fim_interv
from (select to_date('10/11/2011','dd/mm/') data_inicial, 
to_date('10/11/2011 23:59:59','dd/mm/ hh24:mi:ss') data_final from dual)
connect by level = (data_final - data_inicial)*1440/15
order by 1
)
select *
from teste t, interv_15min i
where t.datahora = (select min(t2.datahora) from teste t2 where t2.datahora = 
i.inicio_interv and t2.datahora = i.fim_interv);

CODIGO DATAHORA ODOMETRO INICIO_INTERV FIM_INTERV
-- ---  --- ---
392597 10/11/2011 07:43:00 4847277 10/11/2011 07:30:00 10/11/2011 07:45:00
392597 10/11/2011 07:45:00 4847316 10/11/2011 07:45:00 10/11/2011 08:00:00
392597 10/11/2011 08:01:00 4847664 10/11/2011 08:00:00 10/11/2011 08:15:00
392597 10/11/2011 08:15:00 4847952 10/11/2011 08:15:00 10/11/2011 08:30:00

On Nov 17, 2011, at 13:25 , José Laurindo wrote:

 Esse conceito de último do grupo anterior tá meio confuso pra mim ainda, 
 mas pelo que entendi vc quer ter dois grupos : primeiro quer agrupar em 
 grupos de 15 minutos (é o exemplo do link), e depois dentro resultset vc quer 
 encontrar o máximo valor dentro de cada grupo, aí seria o SELECT anterior 
 dentro de outro, agrupando com GREATEST  O que talvez invalide esse 
 approach é quando vc diz que se não tiver registros pra agrupar dentro do 
 intervalo de 15 minutos aí vc quer o registro mais próximo, não há uma função 
 NEAREST similar á GREATEST - porém, no manual das Analíticas (ie, o Oracle® 
 Database Data Warehousing Guide ele diz , sobre o WINDOW (para obter sliding 
 windows de dados) que se leva em conta se os dados estão próximos da borda da 
 janela, isso pode ser que te atenda ...

 Dá uma pensada em cima, se não sair nada mesmo mostra pra gente até onde vc 
 chegou, que num tempinho livre podemos palpitar mais em cima ...

 []s

 Chiappa


 --- Em oracle_br@yahoogrupos.com.brmailto:oracle_br%40yahoogrupos.com.br, 
 Milton Bastos Henriquis Junior milton.bastos@... escreveu

 Chiappa, obrigado pela ajuda...

 O problema é não basta eu guardar apenas o registro anterior na memória - 
 que é o que as funções analíticas fazem.

 No exemplo aí do link, o cara muda de grupo quando o intervalo entre um 
 registro e outro é maior que 3 segundos... no meu caso é bem diferente, 
 preciso mudar de grupo quando o próximo registro for o maior dentro de um 
 intervalo de tempo, comparando com o ultimo registro do grupo anterior (e 
 não com o registro imediatamente anterior).


 --
 Milton Bastos
 http://miltonbastos.com

 De: oracle_br@yahoogrupos.com.brmailto:oracle_br%40yahoogrupos.com.br 
 [mailto:oracle_br@yahoogrupos.com.brmailto:oracle_br%40yahoogrupos.com.br] 
 Em nome de José Laurindo
 Enviada em: quinta-feira, 17 de novembro de 2011 11:15
 Para: oracle_br@yahoogrupos.com.brmailto:oracle_br%40yahoogrupos.com.br
 Assunto: [oracle_br] Re: SELECT chato!



 Colega, quando se fala em agrupamento não-fixo, dependente de comparações 
 entre registros, E ainda com total cumulativo, quase que Obrigatoriamente se 
 fala em funções analíticas : essas danadas são mais flexíveis que uma cobra 
 de borracha , e mais úteis que qualquer cinto de utilidades de herói dos 
 quadrinhos.
 No caso, eu recomendo o mesmo approach de 
 http://asktom.oracle.com/pls/apex/f?p=100:11:0P11_QUESTION_ID:13946369553642#14274333173515
  , ie : o valor do registro anterior é mantido em memória (essa é uma 
 funcionalidade básica das funções analíticas), e vc o compara com o registro 
 atualmente lido, se estiver no intervalo vc agrupa/totaliza, se não estiver 
 vc inicia um novo grupo... No caso-exemplo do link a pessoa queria agrupar a 
 cada 3 segundos, o conceito é o mesmo pra vc agrupar a cada 15 minutos.

 []s

 Chiappa


 --- Em 
 oracle_br@yahoogrupos.com.brmailto:oracle_br%40yahoogrupos.com.brmailto:oracle_br%40yahoogrupos.com.br,
  Milton Bastos Henriquis Junior milton.bastos@ escreveu

 Bom dia pessoal!

 Ambiente:
 Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit 
 Production (Exadata)

 Estou enferrujado em SQL e preciso fazer um Select que está me 
 assombrando... se alguém 

RES: RES: [oracle_br] Re: SELECT chato!

2011-11-17 Por tôpico jljlsilva
Milton,
se vc adicionar o filtro do código do veículo e colocar um período menor, será 
que evitaria o problema com a temp?
algo assim:

with interv_15min as
(
 select data_inicial + (rownum - 1)/24/60*15 inicio_interv_15m, data_inicial + 
(rownum)/24/60*15 fim_interv_15m, rownum
 from (select to_date('10/11/2011 07:00:00','dd/mm/ hh24:mi:ss') 
data_inicial, to_date('10/11/2011 08:59:59','dd/mm/ hh24:mi:ss') data_final 
from dual)
 connect by level = (data_final - data_inicial)*1440/15
 order by 1
)
select *
from teste t, interv_15min i
where t.datahora = (select min(t2.datahora) from teste t2 where t2.datahora = 
i.inicio_interv_15m and t2.datahora = i.fim_interv_15m)
and   t.codigo = 392597;


--- Em oracle_br@yahoogrupos.com.br, Milton Bastos Henriquis Junior 
milton.bastos@... escreveu

 
 Boa tarde JL!
 
 Muito obrigado pela contribuição... Ainda não consegui testar, pois a query 
 exigiu mais espaço na TEMP, e eu não tenho a senha de SYSTEM para alterar o 
 banco.
 Já mandei uma solicitação pra equipe de infra, vamos ver se me respondem
 
 
 Por enquanto, muito obrigado, assim que eu conseguir rodar a query eu 
 respondo aqui pra vcs!
 
 --
 Milton Bastos
 http://miltonbastos.com
 
 De: oracle_br@yahoogrupos.com.br [mailto:oracle_br@yahoogrupos.com.br] Em 
 nome de JLSilva
 Enviada em: quinta-feira, 17 de novembro de 2011 14:16
 Para: oracle_br@yahoogrupos.com.br
 Assunto: Re: RES: [oracle_br] Re: SELECT chato!
 
 
 
 Milton,
 será que isto resolve?
 gerei os grupos (intervalos de 15 minutos) e peguei os primeiros valores de 
 cada grupo.
 
 with interv_15min as
 (
 select trunc(data_inicial) + (rownum - 1)/24/60*15 inicio_interv, 
 trunc(data_inicial) + (rownum)/24/60*15 fim_interv
 from (select to_date('10/11/2011','dd/mm/') data_inicial, 
 to_date('10/11/2011 23:59:59','dd/mm/ hh24:mi:ss') data_final from dual)
 connect by level = (data_final - data_inicial)*1440/15
 order by 1
 )
 select *
 from teste t, interv_15min i
 where t.datahora = (select min(t2.datahora) from teste t2 where t2.datahora 
 = i.inicio_interv and t2.datahora = i.fim_interv);
 
 CODIGO DATAHORA ODOMETRO INICIO_INTERV FIM_INTERV
 -- ---  --- ---
 392597 10/11/2011 07:43:00 4847277 10/11/2011 07:30:00 10/11/2011 07:45:00
 392597 10/11/2011 07:45:00 4847316 10/11/2011 07:45:00 10/11/2011 08:00:00
 392597 10/11/2011 08:01:00 4847664 10/11/2011 08:00:00 10/11/2011 08:15:00
 392597 10/11/2011 08:15:00 4847952 10/11/2011 08:15:00 10/11/2011 08:30:00
 
 On Nov 17, 2011, at 13:25 , José Laurindo wrote:
 
  Esse conceito de último do grupo anterior tá meio confuso pra mim ainda, 
  mas pelo que entendi vc quer ter dois grupos : primeiro quer agrupar em 
  grupos de 15 minutos (é o exemplo do link), e depois dentro resultset vc 
  quer encontrar o máximo valor dentro de cada grupo, aí seria o SELECT 
  anterior dentro de outro, agrupando com GREATEST  O que talvez invalide 
  esse approach é quando vc diz que se não tiver registros pra agrupar dentro 
  do intervalo de 15 minutos aí vc quer o registro mais próximo, não há uma 
  função NEAREST similar á GREATEST - porém, no manual das Analíticas (ie, o 
  Oracle® Database Data Warehousing Guide ele diz , sobre o WINDOW (para 
  obter sliding windows de dados) que se leva em conta se os dados estão 
  próximos da borda da janela, isso pode ser que te atenda ...
 
  Dá uma pensada em cima, se não sair nada mesmo mostra pra gente até onde vc 
  chegou, que num tempinho livre podemos palpitar mais em cima ...
 
  []s
 
  Chiappa
 
 
  --- Em oracle_br@yahoogrupos.com.brmailto:oracle_br%40yahoogrupos.com.br, 
  Milton Bastos Henriquis Junior milton.bastos@ escreveu
 
  Chiappa, obrigado pela ajuda...
 
  O problema é não basta eu guardar apenas o registro anterior na memória - 
  que é o que as funções analíticas fazem.
 
  No exemplo aí do link, o cara muda de grupo quando o intervalo entre um 
  registro e outro é maior que 3 segundos... no meu caso é bem diferente, 
  preciso mudar de grupo quando o próximo registro for o maior dentro de um 
  intervalo de tempo, comparando com o ultimo registro do grupo anterior (e 
  não com o registro imediatamente anterior).
 
 
  --
  Milton Bastos
  http://miltonbastos.com
 
  De: oracle_br@yahoogrupos.com.brmailto:oracle_br%40yahoogrupos.com.br 
  [mailto:oracle_br@yahoogrupos.com.brmailto:oracle_br%40yahoogrupos.com.br]
   Em nome de José Laurindo
  Enviada em: quinta-feira, 17 de novembro de 2011 11:15
  Para: oracle_br@yahoogrupos.com.brmailto:oracle_br%40yahoogrupos.com.br
  Assunto: [oracle_br] Re: SELECT chato!
 
 
 
  Colega, quando se fala em agrupamento não-fixo, dependente de comparações 
  entre registros, E ainda com total cumulativo, quase que Obrigatoriamente 
  se fala em funções analíticas : essas danadas são mais flexíveis que uma 
  cobra de borracha , e mais úteis que qualquer cinto de utilidades de herói 
  dos quadrinhos.
  No caso, eu