Ir para conteúdo
Thiago Btos

Select - maior registro

Recommended Posts

Boa tarde galera.

 

Fiz um select que tras 4 informações do banco (matricula, nome, data e hora)

SELECT 
    QD1_MAT, 
    RA_NOME, 
    QD1_DTBAIX AS DATA,
    QD1_HRBAIX
FROM QD1010 QD1 
INNER JOIN SRA010 SRA ON RA_MAT = SUBSTR(QD1_MAT, 5) AND SRA.D_E_L_E_T_ <> '*'
ORDER BY QD1_DTBAIX, QD1_HRBAIX

Retornando os seguintes registros:

image.png.d89df981a1ec99f8ee0e5f22d8b720fd.png

 

 

 

Preciso retornar somente as linhas em amarelo, que seria a seguinte condição.

Caso tiver alguma matricula igual, trazer somente o registro com a maior data, junto com seu respectivo horário.

 

 

O mais próximo que consegui chegar foi utilizando o MAX para data e hora, e agrupando o restante dos campos.

SELECT QD1_MAT,RA_NOME,MAX(DATA), MAX(QD1_HRBAIX) FROM (
SELECT 
    QD1_MAT, 
    RA_NOME, 
    QD1_DTBAIX AS DATA,
    QD1_HRBAIX
    FROM QD1010 QD1 
    INNER JOIN SRA010 SRA ON RA_MAT = SUBSTR(QD1_MAT, 5) AND SRA.D_E_L_E_T_ <> '*'
    )
    GROUP BY QD1_MAT,RA_NOME

Porém na hora ele não pega o valor correspondente e sim o valor máximo.

image.png.20af610ce4a25198e9fde5d41c3479f6.png

 

 

Ai estou travado nessa parte, como faço para trazer a hora corresponde sem o restante dos registros?

Compartilhar este post


Link para o post
Compartilhar em outros sites

ALGO ASSIM

SELECT 
    QD1_MAT, 
    RA_NOME, 
    QD1_DTBAIX AS DATA,
    QD1_HRBAIX
FROM QD1010 QD1 
INNER JOIN SRA010 SRA ON (RA_MAT = SUBSTR(QD1_MAT, 5) AND SRA.D_E_L_E_T_ <> '*')
WHERE QD1_DTBAIX = (SELECT MAX()
                     FROM QD1010 QD1B
                     WHERE QD1B.D_E_L_E_T_ <> '*'
                     AND   QD1B.QD1_MAT = QD1.QD1_MAT)
AND QD1.D_E_L_E_T_ <> '*'                     
ORDER BY QD1_DTBAIX, QD1_HRBAIX

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado Motta pela sugestão, mas acabou retornou um outro resultado.

 

Fiz um ajuste no meu código e ficou assim, onde concatenei data com hora e posteriormente usei o max, trazendo um único registro:

SELECT QD1_MAT,RA_NOME,MAX(DT_BAIXA) AS DT_BAIXA FROM (
        SELECT QD1_MAT, RA_NOME, QD1_DTBAIX||' '||QD1_HRBAIX AS DT_BAIXA
        FROM QD1010 QD1 
        INNER JOIN SRA010 SRA ON RA_MAT = SUBSTR(QD1_MAT, 5) AND SRA.D_E_L_E_T_ <> '*'
        WHERE QD1.D_E_L_E_T_ <> '*'
        ORDER BY QD1_DTBAIX, QD1_HRBAIX)
    GROUP BY QD1_MAT,RA_NOME

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por FabianoSouza
      Eu preciso exibir duas informações em minha consulta:
      1) A quantidade de pessoas inscritas numa turma de treinamento (isso é feito com um simples COUNT)
      2) Uma flag de excesso de inscrições na turma. Seria obtido pela comparação entre a quantidade máxima permitida (já existe esse campo) e o COUNT feito acima.
       
      Até aqui sem problemas.
       
      O que quero é evitar fazer duas contagens (1 para saber a quantidade de inscritos, e outra para gerar a flag de excesso de inscrições).
       
      Há uma forma de utilizar UMA contagem para atender as duas necessidades?
       
      Meu código está assim:
       
      ... --AQUI FAZ A COMPARAÇÃO PARA GERAR A FLAG DE EXCESSO DE INSCRIÇÕES , CASE WHEN (SELECT COUNT(*) FROM dbo.tab AS ITT WHERE ITT.codTurmaDeTreina = T.id) > T.lotacaoMax Then T.nome + '&nbsp;'+'<span class=%22icon-aviso fcolor-critico%22 style=%22font-size:18px%22 title=Excesso&nbsp;de&nbsp;inscrições></span>' --AQUI FAZ A CONTAGEM DE INSCRIÇÕES , (SELECT COUNT(*) FROM dbo.tab AS ITT WHERE ITT.codTurmaDeTreina = T.id) AS 'Inscrições'  
    • Por FabianoSouza
      Possuo uma coluna de data.
      Eu gostaria que os registros com datas futuras aparecessem no topo do meu select, em relação aos demais registros.
      Em seguida, gostaria que somente esses registros com datas futuras ficassem em ordem crescente.
      Algo como 
       
      João  | 16/11/2023
      Maria | 17/11/2023
      José  |  20/11/2023
       
      -----------------------------
      (demais registros da base)
      Antônio   |  20/05/2023
      Rosa        | 15/08/2023
      Cida         | 15/10/2022
      Pedro      |  20/05/2021
      Paulo      |  14/11/2020
       
      O select seria esse.
      select dbo.formataData(ET.dataInicial) AS 'data' FROM dbo.tab AS ET GROUP BY ET.dataInicial  
    • Por mateus.andriollo
      Existe uma forma de fazer um IF na select e comparar com Array de dados?
       
      algo como
       
      Select if( in_array(idCliente,'1,2,3,4,5')=true,'Tem','Não') ) as cliente Não consigo usar inner ou where pois esse array é algo q tem varias regras...
       
      Precisava saber se existe uma função assim em MySQL
    • Por mateus.andriollo
      Existe uma forma de fazer um IF na select e comparar com Array de dados?
       
      algo como
       
      Select if( in_array(idCliente,'1,2,3,4,5')=true,'Tem','Não') ) as cliente Não consigo usar inner ou where pois esse resultado do array é algo q tem varias regras...
       
      Precisava saber se existe uma função assim em MySQL
    • Por dfoliveira82
      Bom dia senhores,
       
      sou novo no Oracle, antes trabalhava com SQL SERVER, e me deparei com algo que ja estou a horas tentando solucionar mas nao consegui.
      Nessa Trigger que vou postar, quando mando compilar ela, fala que esta faltando uma virgula, apos o values, mas nao precisa dela e nao acho onde pode ser essa virgula faltante.
      CREATE OR REPLACE TRIGGER JOBS_CL_INSERE_USUARIO AFTER INSERT OR UPDATE OF EXPORTADA_AVA ON SITE_USUARIOS REFERENCING NEW AS NEW BEGIN INSERT INTO BLACKBEAN.TBL_USERS VALUES (NULL, 'INSERT', NULL, 'db', '0', '0', '0', TO_CHAR(:NEW.CPF), MD5(:NEW.CPF||'port@l'), TO_CHAR(:NEW.CPF), SUBSTRING(:NEW.NOME, 1, INSTR(:NEW.NOME, ' ')-1), SUBSTRING(:NEW.NOME, INSTR(:NEW.NOME, ' ')+1, LEN(:NEW.NOME)), 'email@email.com', NULL, NULL, DATE_TO_UNIX_TS(SYSDATE), NULL, NULL); END; / Se alguem puder me ajudar agradeceria.
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.