PDA

View Full Version : [SQL SERVER] Storicizzazione Attributi record e ricostruzione storia


xp2400
29-12-2020, 16:07
Ciao a tutti e auguri. Ma tanto siamo sempre al chiodo. questo il problema.
NB sqlserver 15, quindi tutto a disposizione (UNPIVOT, CROSS APPLY ecc.)


ho una tabella che chiamiamo Giocatori (id, Nome).

1, Messi
2, Ronaldo

poi tante tabelle (almeno 6), che mi portano degli attributi, e validità temporale, tipo

tabStipendi (idGiocatore, DataInizio,DataFine, StipendioEuro)

1, 01/01/2020, 28/02/2020, 10000
1, 28/02/2020, 31/03/2020, 10050
1, 01/04/2020, 01/01/2099, 11000
2, 01/01/2020, 04/07/2020, 20000
2, 05/07/2020, 01/09/2020, 20500
2, 02/09/2020, 01/01/2099, 20700

tabSquadra (idGiocatore, DataInizio, DataFine, Squadra)
1, 01/01/2020, 24/02/2020, Inter
1, 25/02/2020, 31/03/2020, Roma
1, 01/04/2020, 01/01/2099, Juve
2, 01/01/2020, 04/07/2020, Barcellona
2, 05/07/2020, 01/10/2020, Juve
2, 02/10/2020, 01/01/2099, Barcellona

e via cosi.
In queste tabelle, tutte di struttura identica, non ho mai record null, c'è sempre almeno un record della tabella giocatori, e non ci sono - per ogni tabella- periodo sovrapposti.


Risultato che vorrei (dovrei.. ed entro il 7 gennaio :D ) è ricostruire i record in questo modo
GiocatoriStorico (id,Messi, DataInizio, DataFIne, Squadra, Stipendio)

1, Messi ,01/01/2020 ,24/02/2020, Inter, 10000
1, Messi, 25/02/2020, 28/02/2020, Roma,10000
1, Messi, 01/03/2020, 31/03/2020, Roma, 10050
1, Messi, 01/04/2020, 01/01/2020, Juve, 11000
2, Ronaldo 01/01/2020,04/07/2020, Barcellona, 20000
2, Ronaldo 05/07/2020, 01/09/2020, Juve, 20500
2, Ronaldo 02/09/2020,01/10/2020, Juve, 20700
2, Ronaldo, 02/10/2020,01/01/2099, Barcellona, 20700

nelle tabelle degli attributi non ho mai record a null e sovrapposti tra di loro.

si tratta di fare le intersezioni di ogni periodo..
ho provato con union, full join, ma in realtà sto andando assolutamente a caso.
Credo sia un problema relativamente semplice che avrete già risolto in tutti i DWH del mondo...:sofico: io mi sono incartato in maniera mostruosa.

grazie dell'aiuto

Kaya
30-12-2020, 11:06
Se puoi modificare la struttura delle tabelle, io semplificherei aggiungendo il campo "StipendioEuro" nella tabSquadra.
Così puoi anche eliminare la tabStipendi e diventa tutto più semplice da gestire

Se invece non puoi, la cosa è un pelo più complicata (o almeno così la vedo io) poichè devi scrivere una funzione per cui devi vedere se il record della tabella principale da cui vuoi partire E' oppure NON E' all'interno del range di date.
E anche lì con le date dipende da come vuoi gestire...

Se invece le date sai che coincidono sempre (datainizio e datafine coincideranno sempre) allora ti basta una semplice join dove nella where metti che tabSquadra.DataInizio = tabStipendi.DataInizio AND tabSquadra.DataFine = tabStipendi.DataFine)