Pular para o conteúdo
Visualizando 6 posts - 1 até 6 (de 6 do total)
  • Autor
    Posts
  • #93232
    isacjop
    Participante

      Pessoal, 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.

      #93234
      fsitja
      Participante

        Pode, 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;

        #93249
        isacjop
        Participante

          O 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.

          #93257
          isacjop
          Participante

            Outra 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.

            #93265
            fsitja
            Participante

              Beleza, 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;

              #93274
              isacjop
              Participante

                Amigão… Muito obrigado mesmo. Era exatamente isso o que eu precisava.

                Vlw.

              Visualizando 6 posts - 1 até 6 (de 6 do total)
              • Você deve fazer login para responder a este tópico.