Ho un 2008 tabella di database MS SQL che è simile al seguente:Come raggruppare sequenziale, timestamped righe in SQL e restituire l'intervallo di date per ogni gruppo
Registration | Date | DriverID | TrailerID
Un esempio di ciò che alcuni dei dati sarà simile è la seguente:
AB53EDH,2013/07/03 10:00,54,23
AB53EDH,2013/07/03 10:01,54,23
...
AB53EDH,2013/07/03 10:45,54,23
AB53EDH,2013/07/03 10:46,54,NULL <-- Trailer changed
AB53EDH,2013/07/03 10:47,54,NULL
...
AB53EDH,2013/07/03 11:05,54,NULL
AB53EDH,2013/07/03 11:06,54,102 <-- Trailer changed
AB53EDH,2013/07/03 11:07,54,102
...
AB53EDH,2013/07/03 12:32,54,102
AB53EDH,2013/07/03 12:33,72,102 <-- Driver changed
AB53EDH,2013/07/03 12:34,72,102
come si può vedere, i dati rappresentano il driver, e che del rimorchio sono state allegate a cui registrazione in qualsiasi punto nel tempo. Quello che mi piacerebbe fare è generare un report che contenga periodi per i quali sono attive tutte le combinazioni di driver e trailer. Così, per i dati di esempio di cui sopra, vorrei generare qualcosa che assomiglia a questo:
Registration,StartDate,EndDate,DriverID,TrailerID
AB53EDH,2013/07/03 10:00,2013/07/03 10:45,54,23
AB53EDH,2013/07/03 10:46,2013/07/03 11:05,54,NULL
AB53EDH,2013/07/03 11:06,2013/07/03 12:32,54,102
AB53EDH,2013/07/03 12:33,2013/07/03 12:34,72,102
Come si va a fare questo tramite SQL?
AGGIORNAMENTO: Grazie alle risposte finora. Sfortunatamente, hanno smesso di funzionare quando l'ho applicato ai dati di produzione che ho. Le query inviate fino a quel momento non funzionano correttamente se applicate su parte dei dati.
Ecco alcune query di esempio per generare una tabella di dati e popolarla con i dati fittizi sopra. Ci sono più dati qui che nell'esempio sopra: il driver, le combinazioni di trailer 54,23 e 54, NULL sono state ripetute per assicurarsi che le query riconoscano che si tratta di due gruppi distinti. Ho anche replicato gli stessi dati tre volte con diversi intervalli di date, al fine di verificare se le query funziona quando viene eseguito su una parte del set di dati:
CREATE TABLE [dbo].[TempTable](
[Registration] [nvarchar](50) NOT NULL,
[Date] [datetime] NOT NULL,
[DriverID] [int] NULL,
[TrailerID] [int] NULL
)
INSERT INTO dbo.TempTable
VALUES
('AB53EDH','2013/07/03 10:00', 54,23),
('AB53EDH','2013/07/03 10:01', 54,23),
('AB53EDH','2013/07/03 10:45', 54,23),
('AB53EDH','2013/07/03 10:46', 54,NULL),
('AB53EDH','2013/07/03 10:47', 54,NULL),
('AB53EDH','2013/07/03 11:05', 54,NULL),
('AB53EDH','2013/07/03 11:06', 54,102),
('AB53EDH','2013/07/03 11:07', 54,102),
('AB53EDH','2013/07/03 12:32', 54,102),
('AB53EDH','2013/07/03 12:33', 72,102),
('AB53EDH','2013/07/03 12:34', 72,102),
('AB53EDH','2013/07/03 13:00', 54,102),
('AB53EDH','2013/07/03 13:01', 54,102),
('AB53EDH','2013/07/03 13:02', 54,102),
('AB53EDH','2013/07/03 13:03', 54,102),
('AB53EDH','2013/07/03 13:04', 54,23),
('AB53EDH','2013/07/03 13:05', 54,23),
('AB53EDH','2013/07/03 13:06', 54,23),
('AB53EDH','2013/07/03 13:07', 54,NULL),
('AB53EDH','2013/07/03 13:08', 54,NULL),
('AB53EDH','2013/07/03 13:09', 54,NULL),
('AB53EDH','2013/07/03 13:10', 54,NULL),
('AB53EDH','2013/07/03 13:11', NULL,NULL)
INSERT INTO dbo.TempTable
SELECT Registration, DATEADD(M, -1, Date), DriverID, TrailerID
FROM dbo.TempTable
WHERE Date > '2013/07/01'
INSERT INTO dbo.TempTable
SELECT Registration, DATEADD(M, 1, Date), DriverID, TrailerID
FROM dbo.TempTable
WHERE Date > '2013/07/01'
Penso che ci sia un errore dati sui risultati attesi: 'AB53EDH, 2013/07/03 10: 06,2013/07/03 12: 32,54,102' potrebbe essere' AB53EDH, 2013/07/03 1 ** 1 **: 06,2013/07/03 12: 32,54,102' – armen
+1. . . Hai un codice funzionante nella tua domanda. Un'ispirazione per lavorarci. –
@armen: Grazie - corretto –