none
problema con raggruppamento per campi RRS feed

  • Domanda

  • Salve , sono una neofita di SQL SERVER,

    con sql server 2008 r2 ho l'esigenza di effettuare il seguente raggruppamento. Ho provato con la max e gruop by ma i dati non vengono raggruppati per data max ed id_s

    Data la seguente griglia:

    ID        ID_S        targa        Data1 Tipo                    tf Sessione
    385245 1007580 MM-113344-17 19/04/2017 17:49:46 P M 
    385246 1007580 MM-113344-17 20/04/2017 17:23:10 P M 
    385247 1007580 MM-113344-17 20/04/2017 17:41:32 P M 
    385248 1007580 MM-113344-17 20/04/2017 00:00:00 P M 
    23079 1007580 MM-113344-17 20/04/2017 17:20:52 P M 0
    23080 1007580 MM-113344-17 20/04/2017 17:34:47 P M 0
    23081 1007580 MM-113344-17 20/04/2017 17:37:24 P M 0

    ho la necessita di visualizzare i dati della data1 più recente per targa.

    la targa  MM-113344-17 nella data 19/04/2017 ha solo 1 record mentre in data 20/04/2017  ha 6 record.

    il risultato finale che vorrei ottenere è il seguente:

    385245 1007580 MM-113344-17 19/04/2017 17:49:46 P M 

    385247 1007580 MM-113344-17 20/04/2017 17:41:32 P M  (la data più recente per il giorno 20/04/2017 )

    Potete aiutarmi per favore è urgente ?

    Mi potete poi indicare corsi online per sql server t-sql ?

    Grazie

    venerdì 21 aprile 2017 15:47

Risposte

  • Ciao,

    di seguito un paio di esempi per avere il risultato da te cercato:

    -- Creo la tabella di prova
    CREATE TABLE #Test
    (ID Int,
     ID_S Int,
     targa varchar(20),
     Data1 Datetime,
     Tipo Char(1),
     Tf Char(1),
     Sessione smallint
     );
    
     -- Inserisco i dati 
     INSERT INTO #Test (ID,ID_S,targa,Data1,Tipo,Tf,Sessione)
     VALUES (385245,1007580,'MM-113344-17','20170419 17:49:46','P','M',null), 
            (385246,1007580,'MM-113344-17','20170420 17:23:10','P','M',null),
            (385247,1007580,'MM-113344-17','20170420 17:41:32','P','M',null),
            (385248,1007580,'MM-113344-17','20170420 00:00:00','P','M',null),
            (23079,1007580,'MM-113344-17','20170420 17:20:52','P','M',0),
            (23080,1007580,'MM-113344-17','20170420 17:34:47','P','M',0),
            (23081,1007580,'MM-113344-17','20170420 17:37:24','P','M',0);
    
    
    -- Esempio 1
    SELECT T1.* 
      FROM #Test AS T1
         INNER JOIN 
    	   (SELECT targa,MAx(Data1) AS MaxData1 
    	    FROM #Test 
    	    GROUP BY targa, CONVERT(Date,Data1)) AS T2  
    	 ON T1.targa = T2.targa AND T1.Data1 = T2.MaxData1
    ORDER By Targa,Data1;
    
    -- Esempio 2
    SELECT ID,ID_S,targa,Data1,Tipo,Tf,Sessione
      FROM (SELECT *
                  ,ROW_NUMBER() OVER (PARTITION BY Targa,CONVERT(Date,Data1) ORDER BY Data1 DESC) AS Nr
            FROM #Test) AS T
      WHERE Nr = 1
    ORDER By Targa,Data1;
    
    
    -- Pulizia
    DROP TABLE #Test
    
    /* Risultato
    ID	ID_S	targa	Data1	Tipo	Tf	Sessione
    385245	1007580	MM-113344-17	2017-04-19 17:49:46.000	P	M	NULL
    385247	1007580	MM-113344-17	2017-04-20 17:41:32.000	P	M	NULL
    */
    

    Ciao
    Giorgio Rancati

    venerdì 21 aprile 2017 20:18
    Moderatore

Tutte le risposte

  • Ciao,

    di seguito un paio di esempi per avere il risultato da te cercato:

    -- Creo la tabella di prova
    CREATE TABLE #Test
    (ID Int,
     ID_S Int,
     targa varchar(20),
     Data1 Datetime,
     Tipo Char(1),
     Tf Char(1),
     Sessione smallint
     );
    
     -- Inserisco i dati 
     INSERT INTO #Test (ID,ID_S,targa,Data1,Tipo,Tf,Sessione)
     VALUES (385245,1007580,'MM-113344-17','20170419 17:49:46','P','M',null), 
            (385246,1007580,'MM-113344-17','20170420 17:23:10','P','M',null),
            (385247,1007580,'MM-113344-17','20170420 17:41:32','P','M',null),
            (385248,1007580,'MM-113344-17','20170420 00:00:00','P','M',null),
            (23079,1007580,'MM-113344-17','20170420 17:20:52','P','M',0),
            (23080,1007580,'MM-113344-17','20170420 17:34:47','P','M',0),
            (23081,1007580,'MM-113344-17','20170420 17:37:24','P','M',0);
    
    
    -- Esempio 1
    SELECT T1.* 
      FROM #Test AS T1
         INNER JOIN 
    	   (SELECT targa,MAx(Data1) AS MaxData1 
    	    FROM #Test 
    	    GROUP BY targa, CONVERT(Date,Data1)) AS T2  
    	 ON T1.targa = T2.targa AND T1.Data1 = T2.MaxData1
    ORDER By Targa,Data1;
    
    -- Esempio 2
    SELECT ID,ID_S,targa,Data1,Tipo,Tf,Sessione
      FROM (SELECT *
                  ,ROW_NUMBER() OVER (PARTITION BY Targa,CONVERT(Date,Data1) ORDER BY Data1 DESC) AS Nr
            FROM #Test) AS T
      WHERE Nr = 1
    ORDER By Targa,Data1;
    
    
    -- Pulizia
    DROP TABLE #Test
    
    /* Risultato
    ID	ID_S	targa	Data1	Tipo	Tf	Sessione
    385245	1007580	MM-113344-17	2017-04-19 17:49:46.000	P	M	NULL
    385247	1007580	MM-113344-17	2017-04-20 17:41:32.000	P	M	NULL
    */
    

    Ciao
    Giorgio Rancati

    venerdì 21 aprile 2017 20:18
    Moderatore
  • Grazie Giorgio per il prezioso aiuto.

    Ovviamente ora studio !

    Mary

    sabato 22 aprile 2017 12:51