RES: RES: [oracle_br] Re: SELECT chato!
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!
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