- Este tópico contém 5 respostas, 2 vozes e foi atualizado pela última vez 15 anos, 12 meses atrás por
isacjop.
-
AutorPosts
-
18 de março de 2010 às 9:33 pm #93232
isacjop
ParticipantePessoal, trabalho com oracle e estou penando para fazer a seguinte consulta.
tenho que selecionar os dados de uma tabela que devem ser agrupados por três campos(TIPO_IDENTIFICADOR, IDENTIFICADOR, COMPETENCIA)
ESTOU ESCREVENDO O SELECT DA SEGUINTE MANEIRA…
select count(*) from (
select t0.*
from textrato_caged t0
where (t0.IDENTIFICADOR, t0.COMPETENCIA, t0.TIPO_IDENTIFICADOR, PASSAGEM) in
(
select t1.identificador, t1.competencia, t1.tipo_identificador, max(t1.passagem) as passagemmax
from textrato_caged t1
group by t1.identificador, t1.competencia, t1.tipo_identificador
having count(*) > 1
)
order by t0.COMPETENCIA, t0.IDENTIFICADOR
)acontece que o select interno retorna agrupamentos que tem mais de um registro (clausula having) e quando vou selecionar esse dados pelo select pai ele mostra todos os registros de cada agrupamento… pergunto!!! Existe uma maneira de no select pai eu selecionar apenas um registro de cada agrupamento que retornou no select filho?
já tentei usando distinct, mas não funciona.
18 de março de 2010 às 10:59 pm #93234fsitja
ParticipantePode, só não sei qual dos registros você quer exibir quando o grupamento tem mais de um.
Aqui está mostrando o maior t1.passagem para cada grupamento. Se 2 linhas empatarem com Passagem igual vem qualquer um pois não sei o critério de desempate nem qual a PK da tabela.
SELECT *
FROM (SELECT t1.*,
row_number() over(PARTITION BY t1.identificador,
t1.competencia,
t1.tipo_identificador
ORDER BY t1.passagem DESC) rn
FROM textrato_caged t1)
WHERE rn = 1;
19 de março de 2010 às 5:03 pm #93249isacjop
ParticipanteO esquema é o seguinte… se no agrupamento (identificador, competencia, tipo_identificador) tiver so uma passagem máxima eu devo pegar esse registro… se tiver mais de uma passagem máxima devo pegar o registro que tiver a maior data (campo data)… se essas passagem máximas tiverem a mesma data tb, ai devo pegar qualquer registro.
19 de março de 2010 às 5:48 pm #93257isacjop
ParticipanteOutra coisa…
O importante é que essa query pegue os agrupamentos de (identificador, competencia, tipo_identificador) tem que ter mais de um registro… no mínimo dois registros.19 de março de 2010 às 6:38 pm #93265fsitja
ParticipanteBeleza, tinha ficado faltando filtrar só onde tivesse 2 ou mais e o critério de desempate na data:
SELECT *
FROM (SELECT t1.*,
row_number() over(PARTITION BY t1.identificador,
t1.competencia,
t1.tipo_identificador
ORDER BY t1.passagem DESC, t1.campo_data DESC) rn,
count(*) over(PARTITION BY t1.identificador,
t1.competencia,
t1.tipo_identificador) cnt
FROM textrato_caged t1)
WHERE rn = 1 AND cnt > 1;
19 de março de 2010 às 8:46 pm #93274isacjop
ParticipanteAmigão… Muito obrigado mesmo. Era exatamente isso o que eu precisava.
Vlw.
-
AutorPosts
- Você deve fazer login para responder a este tópico.