ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Consulta SQL com registros repetidos

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
natanbh1
Colaborador
Colaborador


Registrado: Terça-Feira, 15 de Março de 2011
Mensagens: 3093
Localização: Belo Horizonte - MG

MensagemEnviada: Ter Abr 03, 2018 3:46 pm    Assunto: Consulta SQL com registros repetidos Responder com Citação

Boa tarde amigos,

Tenho a seguinte consulta SQL abaixo que funciona bem:

Código:
select p.numpro,
p.varapro,
p.numcon,
c.nomcon,
p.numuni,
p.dtinipro,
p.situpro,
p.reupro,
p.obspro,
p.reuautorpro,
max(a.dtand) dtultand
from Juridico.dbo.Jprocessos p
inner join Juridico.dbo.Jcondominios c on p.numcon = c.numcon
inner join Juridico.dbo.Jandamentos a on p.numpro = a.numpro
group by p.numpro,
p.varapro,
p.numcon,
c.nomcon,
p.numuni,
p.dtinipro,
p.situpro,
p.reupro,
p.obspro,
p.reuautorpro


Existem vários andamentos vinculados ao mesmo processo.

Atualmente estou mostrando a data do andamento mais recente vinculado ao processo (max(a.dtand) dtultand).

Estou precisando adicionar também o campo desand (Descrição do andamento) do andamento mais recente vinculado ao processo no retorno do sql.

Já tentei acrescentar este campo e o resultado está vindo com os registros repetidos. Tentei fazer com Max e não repete mas traz o ultimo registro em ordem alfabetica.

Resumindo, eu preciso listar no processo os campos dtand e desand somente do Andamento mais recente.

Desde já agradeço a atenção.
_________________
''A persistência é o caminho para o êxito.''
Charlie Chaplin


Editado pela última vez por natanbh1 em Qui Jun 07, 2018 10:25 am, num total de 4 vezes
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Ter Abr 03, 2018 4:32 pm    Assunto: Responder com Citação

Boa tarde,

Qual banco de dados (e versão) você está utilizando?
Pode existir mais de um registro com a mesma data de andamento? Se pode, qual o critério para definir qual é a mais recente?

_________________
Assinatura: https://www.imoveisemexposicao.com.br/imoveis-alugar-guarulhos-residencial-casa
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
natanbh1
Colaborador
Colaborador


Registrado: Terça-Feira, 15 de Março de 2011
Mensagens: 3093
Localização: Belo Horizonte - MG

MensagemEnviada: Ter Abr 03, 2018 4:50 pm    Assunto: Responder com Citação

Boa tarde Imex,

Utilizo aqui o SQL Server 2008 R2.

Sim, pode haver registros com a mesma data. Neste caso o critério será a data e hora.

Este campo é Datetime e armazena a data/hora no formato yyyy-mm-dd hh:mm:ss.zzz.
_________________
''A persistência é o caminho para o êxito.''
Charlie Chaplin
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Ter Abr 03, 2018 5:16 pm    Assunto: Responder com Citação

Experimente fazer uns testes dessa forma:

Código:
with CTE_RN as
(
    select
        p.numpro,
        p.varapro,
        p.numcon,
        c.nomcon,
        p.numuni,
        p.dtinipro,
        p.situpro,
        p.reupro,
        p.obspro,
        p.reuautorpro,
        a.dtand,
        a.desand,
        row_number() over(partition by p.numpro order by a.dtand desc) as rn
    from Juridico.dbo.Jprocessos p
    inner join Juridico.dbo.Jcondominios c on p.numcon = c.numcon
    inner join Juridico.dbo.Jandamentos a on p.numpro = a.numpro
)

select * from CTE_RN
where rn = 1


Espero que ajude
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
natanbh1
Colaborador
Colaborador


Registrado: Terça-Feira, 15 de Março de 2011
Mensagens: 3093
Localização: Belo Horizonte - MG

MensagemEnviada: Qua Abr 04, 2018 12:29 pm    Assunto: Responder com Citação

Funcionou perfeitamente. Muito obrigado.
_________________
''A persistência é o caminho para o êxito.''
Charlie Chaplin
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
natanbh1
Colaborador
Colaborador


Registrado: Terça-Feira, 15 de Março de 2011
Mensagens: 3093
Localização: Belo Horizonte - MG

MensagemEnviada: Seg Mai 28, 2018 5:26 pm    Assunto: Responder com Citação

Boa tarde Imex,

Estou reabrindo o tópico, porque surgiu um problema.

Adaptei o código SQL que você passou e funcionou perfeitamente no SQL Server:

Código:
with CTE_RN as

(select
p.numpro,
p.varapro,
p.numcon,
c.nomcon,
c.codger,
p.numuni,
p.dtinipro,
p.situpro,
p.reupro,
p.obspro,
p.reuautorpro,
a.dtincand,
a.desand,
a.informand,
row_number() over(partition by p.numpro order by a.dtincand desc) as rn
from Juridico.Jprocessos p
inner join Juridico.Jcondominios c on p.numcon = c.numcon
left join Juridico.Jandamentos a on p.numpro = a.numpro and informand = 'EXTERNO')

select * from CTE_RN
where rn = 1  and numcon = :numcon order by numcon


O problema é que a empresa que trabalho resolveu migrar para o banco MariaDB (MySQL) e a consulta acima até funciona mas demora demais.

No SQL Server demora 2 a 3 segundos já no MariaDB demora 2 a 3 minutos...

Existe alguma maneira de deixar a consulta mais rápida ou outro código SQL que faça o mesmo trabalho e seja mais rápido?

Obrigado.

Citação:
Banco de Dados: MariaDB (MySQL)
Componentes BD: Zeos

_________________
''A persistência é o caminho para o êxito.''
Charlie Chaplin
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Ter Mai 29, 2018 10:04 am    Assunto: Responder com Citação

Bom dia,

Não tenho nenhuma experiência com o MariaDB (MySQL), mas acho essa diferença no desempenho talvez esteja ocorrendo porque o SQL Server estaria conseguindo fazer alguma otimização na consulta antes da execução.
Experimente fazer uns testes da forma abaixo, antecipando um dos filtros e postergando um dos Joins:

Código:
with CTE_RN as
(
    select
        p.numpro,
        p.varapro,
        p.numcon,
        p.numuni,
        p.dtinipro,
        p.situpro,
        p.reupro,
        p.obspro,
        p.reuautorpro,
        a.dtincand,
        a.desand,
        a.informand,
        row_number() over(partition by p.numpro order by a.dtincand desc) as rn
    from Juridico.Jprocessos p
    left join Juridico.Jandamentos a on p.numpro = a.numpro and informand = 'EXTERNO'
    where
        p.numcon = :numcon
)

select
    r.*,
    c.nomcon,
    c.codger
from CTE_RN as r
inner join Juridico.Jcondominios c on r.numcon = c.numcon
where
    r.rn = 1
order by
    numcon


Espero que ajude
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
natanbh1
Colaborador
Colaborador


Registrado: Terça-Feira, 15 de Março de 2011
Mensagens: 3093
Localização: Belo Horizonte - MG

MensagemEnviada: Ter Mai 29, 2018 3:18 pm    Assunto: Responder com Citação

Excelente, Imex! A consulta ficou rápida como no SQL Server.

Muito obrigado novamente.
_________________
''A persistência é o caminho para o êxito.''
Charlie Chaplin
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
natanbh1
Colaborador
Colaborador


Registrado: Terça-Feira, 15 de Março de 2011
Mensagens: 3093
Localização: Belo Horizonte - MG

MensagemEnviada: Qui Jun 07, 2018 10:24 am    Assunto: Responder com Citação

Reabrindo o tópico novamente rsrs...

Uso este SQL em uma consulta em que o usuário pode escolher por qual campo será efetuado o filtro.

Se o filtro é feito pelos campos de dentro da CTE, a pesquisa funciona rápidamente (1 segundo ou menos).

Se o filtro é feito por qualquer campo de fora da CTE (tabela JCondomios), a pesquisa demora (cerca de 90 segundos) travando a aplicação neste tempo.

Exemplo de consulta demorada:

Código:
with CTE_RN as
(
   select p.numpro,
          p.varapro,
          p.numcon,
          p.numuni,
          p.dtinipro, 
          p.situpro,
          p.reupro,
          p.obspro,
          p.reuautorpro,
          a.dtincand,
          a.desand,
          a.informand, 
          row_number() over(partition by p.numpro order by a.dtincand desc) as rn
          from Jprocessos p
          left join Jandamentos a on p.numpro = a.numpro and informand = 'EXTERNO'
)
select
   r.*,
   c.nomcon,
   c.codger
from CTE_RN as r
inner join Jcondominios c on r.numcon = c.numcon
where r.rn = 1 and c.codger = :codger
order by numcon


Qualquer ajuda para reduzir este tempo de consulta será muito bem vinda.

Obrigado.
_________________
''A persistência é o caminho para o êxito.''
Charlie Chaplin
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Qui Jun 07, 2018 11:18 am    Assunto: Responder com Citação

Acho que nesse caso vale a pena fazer uns testes deixando o Join com a tabela Jcondominios dentro da CTE para poder fazer o filtro (no exemplo pelo campo c.codger) também dentro dela.

Espero que ajude
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB