Newsgroup: it.comp.software.database
Titolo: Select (+Delete) per trasformare tabella con timestamp/evento  in tabella con intervallo/evento.

Ciao,
ho una tabella di ingresso di tre colonne  una TIMESTAMP (in POSIX TIME) , EVENTO  booleana e una varchar NOMEVENTO
 
una tabella di uscita di sempre tre  colonne EVENTO,INIZIO EVENTO e FINE EVENTO  (entrambe in posix time):
 
un esempio:
Tabella ingresso eventi
 
1234550	  0	EVENTO2
1234567   0      EVENTO1
1234570   0      EVENTO1
1234577	  1	 EVENTO2
1234571   1      EVENTO1
1234575   1      EVENTO1
1234583   1      EVENTO1
1234594   0      EVENTO1
1234600	  0	EVENTO2
1234650	  0	EVENTO1
1234660	  0	EVENTO2
 
Tabella di uscita Intervalli:
 
EVENTO1	1234571	1234594
EVENTO2 1234577	1234600
 
Non riesco a capire se basta un sql semplice per popolarle o e' necessario comunque fare della programmazione
al volo non mi viene in mente una soluzione semplice.
 
Giulia
 
 
 
 
 
 
 
 


Sinceramente non ho capito con quale criterio vanno inseriti i dati
nella tabella di uscita.
Ovvero, perché hai scelto esattamente le due righe di esempio fra tutte
le righe della tabella di partenza?
 
-- 
David Martin

 le righe della tabella di partenza?
La tabella di ingresso contiene un polling temporale(aperiodico) di un evento che puo' essere(1) o non essere (0)presente,
l tabella di uscita contiene una riga per ogni periodo continuo in cui l'evento e' presente (1) con l'indicazione di inizio e fine,
il periodo si definisce continuo se non e' presente nessuna riga contenente il valore (0) tra l'inizio e la fine delle evento(ordinato per timestamp).
 
Secondo me il problema e' trovare tutti gli inizi dell evento (passaggio da 0 a 1 ) e tutti i termini dell evento(passggio da 1 a 0)
una volta ottentuta questa tabella che perforza contiene un numero pari di righe,
  le righe dispari saranno gli inizi e le pari la fine dell evento.
 
Giulia
 
 
 

  le righe dispari saranno gli inizi e le pari la fine dell evento.
 
Questa cosa non mi convince molto... sei sicura che non ci sono eventi
di inizio senza corrispondente evento di fine?
E comunque al momento non ho capito come trasformare i dati dalla
tabella che ho ottenuto nella tabella che tu vuoi, che metta assieme gli
eventi a coppie.
 
HTH
 
-- 
David Martin

 eventi a coppie.
 
Questo finesettimana ci ragiono su .
 
Grazie
Giulia
 
 

> Questo finesettimana ci ragiono su .
Ok , ho capito il principio, anche se id_evento devo capire se e' superfluo(timestamp ed nomeevento sono chiavi primarie),
se evento ha lo stesso valore allora scarti il risultato e se evento e' diverso allora o e' una fine o e' un inizio e quindi
elabori il risultato.
 
Grazie , adesso vedo di tradurre tutto in mysql....
 
Giulia
 
 
 

 Grazie , adesso vedo di tradurre tutto in mysql....
 
Non ci sono molte cose da cambiare, ho cercato di tenermi sul generico
senza usare funzioni specifiche di SQL Server, proprio per compatibilità.
 
Da un'occhiata veloce, basta che modifichi lo script di creazione della
tabella, tipo:
CREATE TABLE `aaa` (
  `IDEvento` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `Tempo` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE
CURRENT_TIMESTAMP,
  `Evento` varchar(50) NOT NULL,
  `Stato` tinyint(2) NOT NULL,
  PRIMARY KEY (`IDEvento`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
 
Mentre nell'istruzione di selezione devi cambiare il TOP con LIMIT:
SELECT *
  FROM (SELECT Evento
               , Tempo
               , Stato
          FROM (SELECT IDEvento
                       , Tempo
                       , Evento
                       , Stato
                       , StatoPrecedente
                       , CASE
                           WHEN Stato = StatoPrecedente THEN 0
                           ELSE 1
                         END AS Significativo
                  FROM (SELECT tb.IDEvento
                               , tb.Tempo
                               , tb.Evento
                               , tb.Stato
                               , (SELECT Stato
                                    FROM aaa
                                   WHERE Evento = tb.Evento
                                     AND tb.IDEvento > IDEvento
                                   ORDER BY
                                   IDEvento DESC
                                   LIMIT 1) AS StatoPrecedente
                          FROM aaa AS tb) AS
CorrelazioneEventoConEventoPrecedente
                 WHERE StatoPrecedente IS NOT NULL) AS
EstrazioneEventiSignificativi
         WHERE Significativo = 1) AS TabellaOrigine
 ORDER BY
  Evento
  , Tempo;
 
 
 
-- 
David Martin

 CURRENT_TIMESTAMP,
 
Consigliano(siti di programmazione) di non usare la timestamp del db poiche' localizzata e prona ad altri problemi ma quella posix (quindi un intero di 11 
caratteri)
tu che ne pensi ?
 
Giulia
 


Veramente su questo non ti so aiutare, quindi segui il consiglio che hai
trovato in rete.
 
Io di solito non uso timestamp, ma datetime... non so nemmeno perché
nell'esempio ho usato il timestamp :-)
 
-- 
David Martin