Jump to content
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?

Share this post


Link to post
Share on other 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

 

Share this post


Link to post
Share on other 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

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By gamesmax2
      Boa noite,
      Pessoal estou com uma dificuldade no MYSQL, estou querendo obter dados de um cadastro caso ele tenha preenchido todos os Campos, tentei usar o Group by mas não tive sucesso.
       
      Minha tabela e a seguinte:
       
      Nome.              Pedido.            Status
      Daniel.              9955.                 Ok
      Daniel.              9954                  Ok
      Rafael.              9940                  Ok
      Rafael.              9941.                 Aberto
      Rafael.              9942.                 Ok
      Rodrigo.            9961.                 Ok
      Rodrigo.            9962.                 Ok
       
       
      Meu objetivo e puxar os nomes que estão com todos o pedidos relacionado em ok, no caso o Rafael não pode aparece pois ele tem um pedido Aberto, porém não conseguir fazer isso, pessoal peco a ajuda de VCS muito o obrigado.
       
      tentei isso aqui: SELECT nome, pedido, status FROM `cadastros` GROUP BY pedido, nome having status = 'Ok'
    • By gamesmax2
      Boa tarde,
      Pessoal estou com uma dificuldade no MYSQL, estou querendo obter dados de um cadastro caso ele tenha preenchido todos os Campos, tentei usar o Group by mas não tive sucesso.
       
      Minha tabela e a seguinte:
       
      Nome.              Pedido.            Status
      Daniel.              9955.                 Ok
      Daniel.              9954                  Ok
      Rafael.              9940                  Ok
      Rafael.              9941.                 Aberto
      Rafael.              9942.                 Ok
      Rodrigo.            9961.                 Ok
      Rodrigo.            9962.                 Ok
       
       
      Meu objetivo e puxar os nomes que estão com todos o pedidos relacionado em ok, no caso o Rafael não pode aparece pois ele tem um pedido Aberto, porém não conseguir fazer isso, pessoal peco a ajuda de VCS muito o obrigado.
       
      tentei isso aqui: SELECT nome, pedido, status FROM `cadastros` GROUP BY pedido, nome ORDER BY having status = 'Ok'  
       
    • By Thiago Btos
      Bom dia pessoal.
       
      Estou com uma dúvida na estruturação do select.
      Tenho um relatório que está extraindo já informações corretamente, com base no período gerado (inicial e final)
      Exemplo de como está hoje:
      SELECT D.CATEGORIA, SUM(D.VALOR) AS VALOR_VENDA, D.DATA AS (MES_ANO) FROM DUAL D WHERE D.DATA BETWEEN '20210501' AND '20210731' GROUP BY D.CATEGORIA, D.DATA Retornando:
      Categoria | Valor_venda     | Mes_Ano
      1                |     1000,00         | 05/2021
      1                |     2000,00         | 06/2021
      1                |       800,00         | 07/2021
      2                |      500,00          | 05/2021
      2                |      200,00          | 07/2021
      2                |      700,00          | 06/2021
       
      Até ai está tranquilo.
      Porém foi solicitado para adicionar uma coluna YTD (Year to data - acumulado do ano) agrupando o valor total da venda do ano do filtro.
      Então se foi colocado uma data do período Jan/2020 a Mar/2020, essa nova coluna tem que pegar as vendas do ano inteiro de 2020
       
      E precisa me retornar assim:
       
      Categoria | Valor_venda     | Mes_Ano  |  YTD
      1                |     1000,00         | 05/2021   |  15000,00
      1                |     2000,00         | 06/2021   |  15000,00
      1                |       800,00         | 07/2021   |  15000,00
      2                |      500,00          | 05/2021   |  8000,00
      2                |      200,00          | 07/2021   |  8000,00
      2                |      700,00          | 06/2021   |  8000,00
       
      (Os valores de 15000 e 8000 seria a soma do ano inteiro)
       
      O que consegui pensar seria um subselect que tem o where com data do ano, porém nesse caso retorno mais de um resultado no subselect, não dando para usar...
       
      Qual seria a alternativa que tenho?
       
    • By henriquers
      Boa Tarde, a todos
       
      Estou fazendo um relatório que traz em uma pagina web um relatório para ser impresso, mas estou tendo um problema de desempenho para trazer os dados para a pagina web.
      Tenho uma consulta onde traz todos os ID dos funcionários e salvo cada um deste resultado em um Array. E com esses IDs salvo em um array eu faço um loop e dentro faço um select filtrando cada ID de funcionário onde neste select traz as informações de cada um dos funcionário, mas estou com problema nesse select dentro do loop, pois demora quase 2 min para finalizar todas as consultas e trazer as informações na pagina são mais de 130 consulta que faz.
      Pensei em alguns modos de salvar os os todos dados em array com a penas um select mas não consigo filtra por ID.
      $selRE = "SELECT * FROM(SELECT DISTINCT RE, NOME FROM ENG_REL_EPIS WHERE to_date(DATA,'DD/MM/YY') BETWEEN to_date('$dataIni','DD-MM-YY') AND to_date('$dataFim','DD-MM-YY') ) ORDER BY NOME ASC "; $parse2 = oci_parse($conn,$selRE); oci_execute($parse2); while($fetch2=oci_fetch_assoc($parse2)) { $re2[] = $fetch2['RE']; } $cnt = count($re2); $i = 0; while($i < $cnt ){ $select = "SELECT DISTINCT CA,PRODUTO,DESCRICAO,DATA,RE,NOME,QTD FROM ENG_REL_EPIS WHERE to_date(DATA,'DD/MM/YY') BETWEEN to_date('$dataIni','DD-MM-YY') AND to_date('$dataFim','DD-MM-YY') AND RE ='$re2[$i]' ORDER BY DATA ASC"; // echo $select."<br>"; $parse=oci_parse($conn,$select); oci_execute($parse); $fetch=oci_fetch_array($parse); echo " <div class='tamanho'> <br> <!-- ============== BEGIN CABEÇALHO ==================--> <div class='row borda'> <div class='col-sm-4'> <img src='./../../img/logo_p.png' alt='some text' class='logo'> </div> <div class='col-sm borda_esquerda titulo2'> Ficha de Registro de Entrega de Equipamentos de Proteção Individual </div> </div> <br> <div class='row borda titulo'> <div class='col'> PERÍODO: $dataIni a $dataFim </div> </div> <br> <div class='row borda_esquerda_direita_top titulo'> <div class='col'> PRODUTOS </div> </div> <div class='row titulo'> <div class='col-2 borda_top_esquerda'> Data </div> <div class='col-2 borda_top_esquerda'> Código </div> <div class='col-1 borda_top_esquerda'> Qtd </div> <div class='col-1 borda_top_esquerda'> CA </div> <div class='col borda_esquerda_direita_top'> Descrição </div> </div> "; do{ $DATA = date('d/m/Y', strtotime($fetch["DATA"])); $PRODUTO = $fetch["PRODUTO"]; $QTD = $fetch["QTD"]; $CA = $fetch["CA"]; $DESCRICAO = mb_strimwidth($fetch["DESCRICAO"], 0, 48, "..."); $RE = $fetch["RE"]; $NOME = $fetch["NOME"]; echo " <div class='row conteudo'> <div class='col-2 borda_top_esquerda'> $DATA </div> <div class='col-2 borda_top_esquerda'> $PRODUTO </div> <div class='col-1 borda_top_esquerda'> $QTD </div> <div class='col-1 borda_top_esquerda'> $CA </div> <div class='col borda_esquerda_direita_top'> $DESCRICAO </div> </div> "; }while($fetch=oci_fetch_array($parse)); echo " <div class='row borda_top'> &nbsp; </div> <div class='row borda_esquerda_direita_top'> <div class='texto'> Eu $NOME, R.E. $RE. De acordo com as normas regulamentadoras (N.R.) 1.7 e 6.1, declaro e confirmo que recebi da Engemet Metalurgia e Comercio Ltda os Equipamentos de Proteção Individual necessários à minha função, discriminados e assinados por mim, abaixo. Afirmo ainda ter ciência da obrigatoriedade do bom uso e conservação destes, bem como a instrução devida para o uso correto. </div> <br> </div> <div class='row '> <div class='col borda_esquerda_direita_baixo'> <div class='titulo'> $data <br> <br> </div> </div> </div> <div class='row'> <div class='col'> <div class='titulo'> <br><br><br> Assinatura:_____________________________________________________________ </div> </div> </div> </div> <p style='page-break-before:always'></p> "; $i++; oci_free_statement($parse); }  
    • By marco tulio sousa
      Boa tarde,
       
      FIz a declaração abaixo e tinha expectativa que o relatório retornado tivesse datas de inicio e termino de afastamento e ferias.
      Afastamentos estão em 1 tabela e férias em outra.
      Erro ORA-000936
      Que devo fazer?
       
       
      SELECT 
      SUBSTR(RHCGED_ALT_SIT_FUN.CODIGO, -6)
      Matric,
      RHCGED_ALT_SIT_FUN.COD_SIT_FUNCIONAL,
      CASE
       WHEN RHCGED_ALT_SIT_FUN.COD_SIT_FUNCIONAL = '1216' THEN 'ATESTADO'
       WHEN RHCGED_ALT_SIT_FUN.COD_SIT_FUNCIONAL = '1211' THEN 'INSS'
       WHEN RHCGED_ALT_SIT_FUN.COD_SIT_FUNCIONAL = '1220' THEN 'INSS'
       WHEN RHCGED_ALT_SIT_FUN.COD_SIT_FUNCIONAL = '1218' THEN 'MATERNID'
       WHEN RHCGED_ALT_SIT_FUN.COD_SIT_FUNCIONAL = '1118' THEN 'MATERNIDADE'
       WHEN RHCGED_ALT_SIT_FUN.COD_SIT_FUNCIONAL = '1318' THEN 'PATERNIDADE'
       WHEN RHCGED_ALT_SIT_FUN.COD_SIT_FUNCIONAL = '1210' THEN 'LIC REMUN'
      END TIPO_AFAST,
      TO_DATE(RHCGED_ALT_SIT_FUN.DATA_INIC_SITUACAO) DT_INIC_AFAST,
      TO_DATE(RHCGED_ALT_SIT_FUN.DATA_FIM_SITUACAO) DT_FIM_AFAST,
      TO_DATE(RHFERI_FERIAS.DT_INI_GOZO) DT_INIC_FERIAS,
      TO_DATE(RHFERI_FERIAS.DT_FIM_GOZO) DT_FIM_FERIAS
       
      FROM CRHH.RHCGED_ALT_SIT_FUN
      INNER JOIN CRHH.RHFERI_FERIAS ON RHCGED_ALT_SIT_FUN.CODIGO = RHFERI_FERIAS.CODIGO_CONTRATO

      WHERE 
      RHCGED_ALT_SIT_FUN.COD_SIT_FUNCIONAL In ('1216','1211','1220','1218','1118','1318','1210')
      AND
      CRHH.RHCGED_ALT_SIT_FUN.CODIGO >=lpad(:texto_1,15,'0')
      AND RHCGED_ALT_SIT_FUN.CODIGO  <=lpad(:texto_2,15,'0')
      ORDER BY RHCGED_ALT_SIT_FUN.DATA_INIC_SITUACAO DESC
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.