none
select de acesso RRS feed

  • Pergunta

  • id data hora

    1 20/11/2016 07:30 1 20/11/2016 12:30 1 20/11/2016 14:30 1 20/11/2016 18:30

    3 20/11/2016 06:30 3 20/11/2016 11:30 3 20/11/2016 15:30

    2 20/11/2016 17:00

    Tenho esses dados inseridos no meu banco de dados e quero fazer um select que pega o primeiro e o ultimo registro de cada id

    então meu select me retorna o seguinte:

    1 20/11/2016 07:30 1 20/11/2016 18:30

    3 20/11/2016 06:30

    3 20/11/2016 15:30

    2 20/11/2016 17:00



    Atenciosamente,
    José Henrique Sabino

    segunda-feira, 21 de novembro de 2016 12:38

Respostas

  • Acredito que essa query já faz o que vc quer , mostra por usuario e dia logado a primeira e ultima batida de ponto

    DECLARE @table TABLE (id INT ,dataAcesso VARCHAR(MAX) ,horario VARCHAR(5))

    INSERT INTO @table
            ( id, dataAcesso, horario ) VALUES  ( 1,'20/11/2016', '09:30' )
       
    ,( 1,'20/11/2016', '12:00' )
    ,( 1,'20/11/2016', '13:00' )
    ,( 1,'20/11/2016', '18:30' )
    ,( 4,'20/11/2016', '08:30' )
    ,( 4,'20/11/2016', '12:01' )
    ,( 4,'20/11/2016', '13:10' )
    ,( 4,'20/11/2016', '18:00' )
    ,( 1,'22/11/2016', '10:00' )
    ,( 1,'22/11/2016', '12:00' )
    ,( 1,'22/11/2016', '13:00' )
    ,( 1,'22/11/2016', '18:30' )


    SELECT T.id ,
           T.dataAcesso ,
            [Primeiro Acesso] =MIN(t.horario),
    [Ultimo Acesso] =MAX(t.horario) FROM  @table AS T
      GROUP BY T.id,T.dataAcesso


    Wesley Neves

    • Sugerido como Resposta Junior Galvão - MVPMVP terça-feira, 22 de novembro de 2016 14:02
    • Marcado como Resposta Xarp2 terça-feira, 22 de novembro de 2016 16:09
    terça-feira, 22 de novembro de 2016 11:24

Todas as Respostas

  • Da uma olhada no outro post que c criou 

    isso resolve ?

    DECLARE @table TABLE (id INT ,dataAcesso VARCHAR(MAX) ,horario VARCHAR(5))

    INSERT INTO @table
            ( id, dataAcesso, horario ) VALUES  ( 1,'20/11/2016', '09:30' )
        ,( 1,'20/11/2016', '12:00' )
    ,( 1,'20/11/2016', '13:00' )
    ,( 1,'20/11/2016', '18:30' )
    ,( 4,'20/11/2016', '08:30' )
    ,( 4,'20/11/2016', '12:01' )
    ,( 4,'20/11/2016', '13:10' )
    ,( 4,'20/11/2016', '18:00' );
     


     WITH   Dados
              AS ( SELECT   T.id ,
                            T.dataAcesso ,
                            T.horario,
    PrimeiroAcesso = FIRST_VALUE(t.horario) OVER(PARTITION BY T.id ORDER BY T.id),
    UltimoAcesso = LAST_VALUE(t.horario) OVER(PARTITION BY T.id ORDER BY T.id)
                   FROM     @table AS T
                 )
        SELECT  Dados.id ,
                Dados.dataAcesso ,
                Dados.horario,
    Dados.PrimeiroAcesso,
    Dados.UltimoAcesso
        FROM    Dados
    WHERE Dados.horario = Dados.PrimeiroAcesso 
    ORDER BY Dados.id


    Wesley Neves

    OU de forma mais simples , com group by

    DECLARE @table TABLE (id INT ,dataAcesso VARCHAR(MAX) ,horario VARCHAR(5))

    INSERT INTO @table
            ( id, dataAcesso, horario ) VALUES  ( 1,'20/11/2016', '09:30' )
       
    ,( 1,'20/11/2016', '12:00' )
    ,( 1,'20/11/2016', '13:00' )
    ,( 1,'20/11/2016', '18:30' )
    ,( 4,'20/11/2016', '08:30' )
    ,( 4,'20/11/2016', '12:01' )
    ,( 4,'20/11/2016', '13:10' )
    ,( 4,'20/11/2016', '18:00' );
     


    SELECT T.id ,
           T.dataAcesso ,
            [Primeiro Acesso] =MIN(t.horario),
    [Ultimo Acesso] =MAX(t.horario) FROM  @table AS T
      GROUP BY T.id,T.dataAcesso

    • Editado Wesley Neves segunda-feira, 21 de novembro de 2016 12:47 correção
    segunda-feira, 21 de novembro de 2016 12:44
  • 1	20/11/2016	09:30	18:30
    4	20/11/2016	08:30	13:10

    Deu certo mesmo, me retornou assim como acima.

    qual mudança que faço no select para ele ficar assim,separados

    1 20/11/2016 09:30

    1 20/11/2016  18:30

    4 20/11/2016 08:30

    4 20/11/2016  13:10


    Atenciosamente,
    José Henrique Sabino


    • Editado Xarp2 segunda-feira, 21 de novembro de 2016 12:58
    segunda-feira, 21 de novembro de 2016 12:57
  • Isso vc vai jogar em um GridView certo ?

    quem vai fazer isso e o GridView ,ou seu Relátorio, 


    Wesley Neves

    segunda-feira, 21 de novembro de 2016 13:13
  • Sim, esta sendo listado em um grid

    Atenciosamente,
    José Henrique Sabino

    segunda-feira, 21 de novembro de 2016 13:15
  • 1)Nesse caso vc vai pegar o resultado da query 

    2) Popular o Griview com os dados 

    3)manipular o GridView para exibir da forma que vc quer. agredito  tem que griar um agrupador no Grid


    Wesley Neves

    segunda-feira, 21 de novembro de 2016 13:30
  • No meu select esta faltando o seguinte também e não estou conseguindo resolver, esse filtro e por data então se o usuário teve acesso em em 2 dias e pega o maior e o menor dos dois dias juntos. ele tinha era que pega o o maior e o menor de um dia e o maior e o menor do outro dia separados


    Atenciosamente,
    José Henrique Sabino

    terça-feira, 22 de novembro de 2016 10:56
  • Acredito que essa query já faz o que vc quer , mostra por usuario e dia logado a primeira e ultima batida de ponto

    DECLARE @table TABLE (id INT ,dataAcesso VARCHAR(MAX) ,horario VARCHAR(5))

    INSERT INTO @table
            ( id, dataAcesso, horario ) VALUES  ( 1,'20/11/2016', '09:30' )
       
    ,( 1,'20/11/2016', '12:00' )
    ,( 1,'20/11/2016', '13:00' )
    ,( 1,'20/11/2016', '18:30' )
    ,( 4,'20/11/2016', '08:30' )
    ,( 4,'20/11/2016', '12:01' )
    ,( 4,'20/11/2016', '13:10' )
    ,( 4,'20/11/2016', '18:00' )
    ,( 1,'22/11/2016', '10:00' )
    ,( 1,'22/11/2016', '12:00' )
    ,( 1,'22/11/2016', '13:00' )
    ,( 1,'22/11/2016', '18:30' )


    SELECT T.id ,
           T.dataAcesso ,
            [Primeiro Acesso] =MIN(t.horario),
    [Ultimo Acesso] =MAX(t.horario) FROM  @table AS T
      GROUP BY T.id,T.dataAcesso


    Wesley Neves

    • Sugerido como Resposta Junior Galvão - MVPMVP terça-feira, 22 de novembro de 2016 14:02
    • Marcado como Resposta Xarp2 terça-feira, 22 de novembro de 2016 16:09
    terça-feira, 22 de novembro de 2016 11:24
  • Sabino,

    Com base no cenário proposta para o Wesley você poderá justamente obter os dados de um determinado dia, recomendo que você adicione mais alguns registros com valores de data distintos e no bloco do comando Select adicione uma cláusula Where justamente para que você informe o dia desejado para se obter os apontamentos.


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quinta-feira, 24 de novembro de 2016 23:33