Venerdi alle 11.30 partirò per Seattle per l'MVP Summit 2008. Il ritorno è previsto per il 18 Aprile e durante questo periodo cerchero di bloggare tutto ciò che non sarò strettamente sotto NDA.
Detto questo, però, prima di partire vorrei lanciare quiz lasciandovi cosi una decina di giorni di tempo per trovarne la soluzione. Il quiz è piuttosto complesso ed è sempre legato all'utilizzo di dati temporali, e come in precedenza lo spunto me lo ha dato Alberto che tempo fa mi sottopose una problematica interessante, che può sicuramente essere un buon esercizio utile a tutti per cercare di ragionare sempre più in modo "Set-Oriented"
La situazione di partenza è questa:
USE [tempdb]
GO
IF (OBJECT_ID('dbo.S1') IS NOT NULL) DROP TABLE dbo.S1;
IF (OBJECT_ID('dbo.S2') IS NOT NULL) DROP TABLE dbo.S2;
GO
CREATE TABLE [dbo].[S1](
[Telefono] VARCHAR(100) NOT NULL,
[DataInizio] [int] NOT NULL,
[DataFine] [int] NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[S2](
[Indirizzo] VARCHAR(100) NOT NULL,
[DataInizio] [int] NOT NULL,
[DataFine] [int] NULL
) ON [PRIMARY]
GO
insert [dbo].[S1] ([Telefono], [DataInizio], [DataFine]) values ('12345', 20071219, 20080202)
insert [dbo].[S1] ([Telefono], [DataInizio], [DataFine]) values ('67890', 20080202, null)
insert [dbo].[S2] ([Indirizzo], [DataInizio], [DataFine]) values ('Via Forze Armate 13', 20071201, 20071231)
insert [dbo].[S2] ([Indirizzo], [DataInizio], [DataFine]) values ('Via Liberta 77', 20071231, null)
GO
Si hanno quindi due tabelle S1 e S2 che contengono delle informazioni sulle variazioni dei dati avvenuti in una anagrafica utenti (la tabella dell'anagrafica cliente non l'abbiamo e non ci serve). La tabella S1 contiene le modifiche avvenute al numero di telefono di un ipotetico utente, la tabella S2 contiene invece le modifiche all'indirizzo dello stesso.
Per semplicità ipotizziamo che tutte le modifche siano relative ad un solo utente.
DataInizio e DataFine definiscono il range di validità temporale del valore. Quando datafine = null significa che quella riga rappresenta il valore attualmente in uso.
Applicando questa logica, la tabella S1 ha questo significato:
- l'utente ci ha comunicato il suo numero di telefono (12345) la prima volta nel 2007-12-19.
- l'utente ha mantenuto tale numero di telefono fino al 2008-02-02
- dal 2008-02-02 il numero di telefono cambia e diventa 67890
- Il numero di telefono suddetto è quello attualmente in uso
La richiesta è molto semplice: produrre un risultato che ricostruisca in modo consolidato lo storico dei dati di questo utente, tenendo conto della validità temporale degli stessi.
Dobbiamo quindi produrre questo risultato:

Non usate cursori ne cicli ovviamente 
Risolvere questo quiz aiuta ad esercitarsi a pensare ragionando in termini di insiemi piuttosto che di singole righe, tenendo però conto delle connotazioni temporali che hanno i dati.
Questo porta a disegnare meglio i database ed a poter recupera i dati tendendo correttamente in considerazione la loro validità nel tempo.
E poi è semplicemente una bella sfida da superare 