none
Agrupar por data RRS feed

  • Pergunta

  • Galera tenho o seguinte problema, o sql abaixo traz as datas por minuto, porém não consigo agrupar segue o retorno é do select abaixo:
    RETORNO:
    24/09/2009 08:29
    24/09/2009 08:29
    24/09/2009 08:29
    24/09/2009 08:29
    24/09/2009 08:30
    24/09/2009 08:30
    24/09/2009 08:30
    24/09/2009 08:30
    24/09/2009 08:31
    24/09/2009 08:31
    24/09/2009 08:31
    24/09/2009 08:31

    SELECT:

    select    replicate('0', (2 -  len(cast(datepart(dd, DataHoraSatelite) as varchar)))) + cast(datepart(dd, DataHoraSatelite) as varchar) + '/' +
            replicate('0', (2 -  len(cast(datepart(mm, DataHoraSatelite) as varchar)))) + cast(datepart(mm, DataHoraSatelite) as varchar) + '/' +
            cast(datepart(yyyy, DataHoraSatelite) as varchar)  + ' ' +
            replicate('0', (2 - len(cast(datepart(hh, DataHoraSatelite) as varchar)))) + cast(datepart(hh, DataHoraSatelite) as varchar) + ':' +
            replicate('0', (2 - len(cast(datepart(mi, DataHoraSatelite) as varchar)))) + cast(datepart(mi, DataHoraSatelite) as varchar) as DataHora
            --LatitudePonto, LongitudePonto
    FROM GPSCoordenadaTecnico
    WHERE PrecisaoLocal < 16    
      AND NumSatelites > 2    
      AND (DataHoraSatelite >= '2009-09-24 00:00:00.000' AND DataHoraSatelite <= '2009-09-24 23:59:59.999')    
      AND SimCardMobile = '8955050170000189129' 
    GROUP BY DataHoraSatelite, LatitudePonto, LongitudePonto
    ORDER BY DataHoraSatelite ASC

    Alguém pode ajudar
    quarta-feira, 21 de outubro de 2009 14:16

Respostas

  • Boa tarde Maxjv

    Segue uma sugestão:

    DECLARE @GPSCoordenadaTecnico TABLE (DataHoraSatelite DATETIME)
    
    INSERT @GPSCoordenadaTecnico SELECT GETDATE() 
    INSERT @GPSCoordenadaTecnico SELECT GETDATE() 
    INSERT @GPSCoordenadaTecnico SELECT GETDATE() 
    INSERT @GPSCoordenadaTecnico SELECT DATEADD(MI,10,GETDATE())
    INSERT @GPSCoordenadaTecnico SELECT DATEADD(MI,10,GETDATE())
    INSERT @GPSCoordenadaTecnico SELECT DATEADD(MI,10,GETDATE())
    INSERT @GPSCoordenadaTecnico SELECT DATEADD(MI,10,GETDATE())
    
    SELECT 
    	DataHora = CONVERT(CHAR(10),DataHoraSatelite,103) + ' ' + CONVERT(CHAR(5),DataHoraSatelite,108)  
    FROM 
    	@GPSCoordenadaTecnico
    GROUP BY
    	CONVERT(CHAR(10),DataHoraSatelite,103) + ' ' + CONVERT(CHAR(5),DataHoraSatelite,108)  
    ORDER BY		
    	DataHora
    

    Espero que seja útil.








    att. Leonardo Marcelino
    • Sugerido como Resposta Leonardo Marcelino quarta-feira, 21 de outubro de 2009 14:35
    • Marcado como Resposta Maxjv quarta-feira, 21 de outubro de 2009 14:49
    quarta-feira, 21 de outubro de 2009 14:34

Todas as Respostas

  • Boa tarde Maxjv

    Segue uma sugestão:

    DECLARE @GPSCoordenadaTecnico TABLE (DataHoraSatelite DATETIME)
    
    INSERT @GPSCoordenadaTecnico SELECT GETDATE() 
    INSERT @GPSCoordenadaTecnico SELECT GETDATE() 
    INSERT @GPSCoordenadaTecnico SELECT GETDATE() 
    INSERT @GPSCoordenadaTecnico SELECT DATEADD(MI,10,GETDATE())
    INSERT @GPSCoordenadaTecnico SELECT DATEADD(MI,10,GETDATE())
    INSERT @GPSCoordenadaTecnico SELECT DATEADD(MI,10,GETDATE())
    INSERT @GPSCoordenadaTecnico SELECT DATEADD(MI,10,GETDATE())
    
    SELECT 
    	DataHora = CONVERT(CHAR(10),DataHoraSatelite,103) + ' ' + CONVERT(CHAR(5),DataHoraSatelite,108)  
    FROM 
    	@GPSCoordenadaTecnico
    GROUP BY
    	CONVERT(CHAR(10),DataHoraSatelite,103) + ' ' + CONVERT(CHAR(5),DataHoraSatelite,108)  
    ORDER BY		
    	DataHora
    

    Espero que seja útil.








    att. Leonardo Marcelino
    • Sugerido como Resposta Leonardo Marcelino quarta-feira, 21 de outubro de 2009 14:35
    • Marcado como Resposta Maxjv quarta-feira, 21 de outubro de 2009 14:49
    quarta-feira, 21 de outubro de 2009 14:34
  • Valeu Leonardo,
             em parte é isso mesmo, mas o problema é que tenho que adicionar mais duas colunas ( LatitudePonto e LongitudePonto )  dae é o problema !

    SELECT DATAHORA = CONVERT(CHAR(10), DataHoraSatelite, 103) + ' ' + CONVERT(CHAR(5), DataHoraSatelite, 108), LatitudePonto, LongitudePonto
    FROM GPSCoordenadaTecnico
    WHERE PrecisaoLocal < 16    
      AND NumSatelites > 2    
      AND (DataHoraSatelite >= '2009-09-24 00:00:00.000' AND DataHoraSatelite <= '2009-09-24 23:59:59.999')    
      AND SimCardMobile = '8955050170000189129' 
    GROUP BY CONVERT(CHAR(10), DataHoraSatelite, 103) + ' ' + CONVERT(CHAR(5),DataHoraSatelite, 108)--, LatitudePonto, LongitudePonto
    ORDER BY DataHora ASC

    abraço!
    quarta-feira, 21 de outubro de 2009 14:55
  • Maxjv,

    caso ainda precise, coloque o resultado que esta trazendo e o resultado que você quer, para ver o que podemos fazer.

    att. Leonardo Marcelino
    quarta-feira, 21 de outubro de 2009 15:56
  • Certo.
    SQL:
    SELECT DATAHORA = CONVERT(CHAR(10), DataHoraSatelite, 103) + ' ' + CONVERT(CHAR(5), DataHoraSatelite, 108), LatitudePonto, LongitudePonto
    FROM GPSCoordenadaTecnico
    WHERE PrecisaoLocal < 16    
      AND NumSatelites > 2    
      AND (DataHoraSatelite >= '2009-09-24 00:00:00.000' AND DataHoraSatelite <= '2009-09-24 23:59:59.999')    
      AND SimCardMobile = '8955050170000189129' 
    GROUP BY CONVERT(CHAR(10), DataHoraSatelite, 103) + ' ' + CONVERT(CHAR(5),DataHoraSatelite, 108), LatitudePonto, LongitudePonto
    ORDER BY DataHora ASC

    Resultado que aparece:
    DATAHORA            LatitudePonto        LongitudePonto
    24/09/2009 08:29    -9,38033683333333    -38,2283227
    24/09/2009 08:29    -9,38038481666667    -38,2280274166667
    24/09/2009 08:29    -9,38043128333333    -38,2277051333333
    24/09/2009 08:30    -9,38031785               -38,2285953666667
    24/09/2009 08:30    -9,38058505              -38,22870895
    24/09/2009 08:30    -9,38084615              -38,2288335
    24/09/2009 08:31    -9,38341046666667    -38,2286131333333
    24/09/2009 08:31    -9,38368871666667    -38,22864005
    24/09/2009 08:31    -9,38401263333333    -38,2286998

    Resultado esperado (para esse caso pode ser sempre o último resultado da data ex: abaixo:
    DATAHORA            LatitudePonto        LongitudePonto
    24/09/2009 08:29    -9,38043128333333    -38,2277051333333
    24/09/2009 08:30    -9,38084615              -38,2288335
    24/09/2009 08:31    -9,38401263333333    -38,2286998
    quarta-feira, 21 de outubro de 2009 16:10
  • Segue uma nova sugestão:


    DECLARE @GPSCoordenadaTecnico TABLE 
    (DataHoraSatelite DATETIME
    ,LatitudePonto    VARCHAR(20)
    ,LongitudePonto   VARCHAR(20)
    ,PrecisaoLocal    TINYINT DEFAULT 1
    ,NumSatelites     TINYINT DEFAULT 3
    ,SimCardMobile    VARCHAR(50) DEFAULT '8955050170000189129'  
    
    )
    
    -- SETO UMA VARIÁVEL DE ACORDO COM OS DADOS DO PRIMEIRO 
    DECLARE @DATA DATETIME
    SET @DATA = '20090924 08:29:00'
    
    -- POPULO A TABELA TEMPORÁRIA
    -- OBS.: Na minha lógica a data e hora q se repetem não repete os segundos,
    -- então na hora de popular a tabela diferenciei os segundos!
    INSERT INTO @GPSCoordenadaTecnico (DataHoraSatelite,LatitudePonto,LongitudePonto) 
          SELECT DATEADD(SS,10,@DATA), '-9,38033683333333', '-38,2283227' 
    UNION SELECT DATEADD(SS,20,@DATA), '-9,38038481666667', '-38,2280274166667'
    UNION SELECT DATEADD(SS,30,@DATA), '-9,38043128333333', '-38,2277051333333'
    UNION SELECT DATEADD(MI,01,@DATA), '-9,38031785'      , '-38,2285953666667'
    UNION SELECT DATEADD(MI,01,DATEADD(SS,10,@DATA)), '-9,38058505', '-38,22870895'
    UNION SELECT DATEADD(MI,01,DATEADD(SS,20,@DATA)), '-9,38084615', '-38,2288335'
    UNION SELECT DATEADD(MI,02,@DATA), '-9,38341046666667', '-38,2286131333333'
    UNION SELECT DATEADD(MI,02,DATEADD(SS,10,@DATA)), '-9,38368871666667', '-38,22864005'
    UNION SELECT DATEADD(MI,02,DATEADD(SS,20,@DATA)), '-9,38401263333333', '-38,2286998'
    
    -- Carrego uma CTE com o select, acrescentado um ID sequencial validado por  data e hora c/segundos
    ;WITH GPS AS 
    (
        SELECT 
            ID = ROW_NUMBER() OVER (PARTITION BY CONVERT(CHAR(10), DataHoraSatelite, 103) + ' ' + LEFT(CONVERT(CHAR(8), DataHoraSatelite, 108),5) ORDER BY CONVERT(CHAR(8), DataHoraSatelite, 108)),
            DataHora = CONVERT(CHAR(10), DataHoraSatelite, 103) + ' ' + LEFT(CONVERT(CHAR(8), DataHoraSatelite, 108),5), 
            LatitudePonto, 
            LongitudePonto
        FROM 
            @GPSCoordenadaTecnico
        WHERE 
            PrecisaoLocal < 16     
            AND NumSatelites > 2     
            AND DataHoraSatelite BETWEEN '2009-09-24' AND '2009-09-24 23:59:59.999'     
            AND SimCardMobile = '8955050170000189129'  
        GROUP BY 
            CONVERT(CHAR(10), DataHoraSatelite, 103), 
            CONVERT(CHAR(8) , DataHoraSatelite, 108), 
            LatitudePonto, LongitudePonto
    )
    
    
    SELECT G.DataHora, G.LatitudePonto, G.LongitudePonto
    FROM GPS AS G 
    INNER JOIN 
        (SELECT A.DataHora,MAX(A.ID) AS ID 
         FROM GPS AS A 
         GROUP BY A.DataHora
        ) AS N ON N.ID = G.ID AND N.DataHora = G.DataHora
    
    
    
    -- Se for útil, classifique o post.




    att. Leonardo Marcelino
    quinta-feira, 22 de outubro de 2009 02:22
  • serve apenas para sql2005 e 2008.
    att. Leonardo Marcelino
    quinta-feira, 22 de outubro de 2009 02:23