Είναι σπάνιο το φαινόμενο σε μια λύση BI και σε ένα DW να μην ζητείται ανάλυση και reporting των δεδομένων με βάση κάποια χρονική περίοδο.Το σύνηθες είναι να έχω τουλάχιστον μία διάσταση χρόνου. Για το λόγο αυτό σε αυτό το post θα δούμε πως μπορούμε να σχεδιάσουμε και υλοποιήσουμε σε μια BI λύση μια τέτοια διάσταση.Για αρχή θα ξεκινήσουμε να δούμε την λογική με την οποία θα σχεδιάσουμε ένα time dimension.
Σχεδιάζοντας ένα Time Dimension
Το πρώτο πράγμα που πρέπει να λάβουμε υπόψη είναι το επίπεδο λεπτομέρειας (level of granularity) το οποίο θέλουμε να έχουμε στην διάσταση μας. Αυτό μπορεί να ξεκινάει από millisecond μέχρι αιώνες. Όσο μικρότερο είναι το επίπεδο που θα επιλέξουμε τόσες περισσότερες θα είναι και οι γραμμές (records) που θα υπάρχουν μέσα στον πίνακα που έχουμε σαν τελικό αποτέλεσμα. Στις περισσότερες περιπτώσεις το επίπεδο αυτό μπορεί να είναι η ημέρα, αλλά αν έχω κάποια γραμμή παραγωγής ή real-time analysis τότε είναι αρκετά πιθανόν να ξεκινάω από millisecond.Επειδή όμως τα ερωτήματα που θα γίνονται δεν θα αφορούν μόνο το τελευταίο επίπεδο αλλά σίγουρα θα ζητάνε και ποιο συγκεντρωτικά στοιχεία όπως για παράδειγμα σε επίπεδο μήνα, τριμήνου, έτους κλπ θα πρέπει να έχω φροντίσει μέσα στην δομή μου να υποστηρίζονται αυτά. Αυτό εύκολα γίνεται αρκεί μέσα στη διάσταση μου να συμπεριλάβω attributes(πεδία) τα οποία να μου ορίζουν τα παραπάνω. Με αυτό μου δίνεται η δυνατότητα να φτιάξω μια temporal ιεραρχία μέσα από την οποία θα μπορεί ο χρήστης να κάνει drilling στα αποτελέσματα μέσω αυτής.Χρήσιμο είναι επίσης όταν σχεδιάζω μια τέτοια διάσταση να λάβω υπόψη μου περιπτώσεις που είναι καθαρά επιχειρηματικές όπως για παράδειγμα μπορεί η οικονομική χρήση της εταιρίας να είναι διαφορετική από την γνωστή αμιγώς ετήσια χρήση (Ιανουάριος – Δεκέμβριος) δηλαδή να είναι από Ιούλιο – Ιούνιο ή Ιούνιο – Μάιο. Ακόμα μπορεί η εταιρία να είναι μια εταιρία εξωτερικού που έχει παράρτημα στην Ελλάδα το οποίο πρέπει να συμμορφωθεί με τις επίσημες αργίες της χώρας που η μαμά εταιρία ανήκει. Για να γίνουν όλα αυτά πράξη πάλι με την προσθήκη των κατάλληλων attributes μπορώ να τα ορίσω.
Υλοποίηση ενός Time Dimension
Για να υλοποιήσω τώρα μια τέτοια διάσταση θα πρέπει να δράσω με διαφορετικό τρόπο σε σχέση με τις άλλες διαστάσεις τις οποίες συνήθως γεμίζω με στοιχεία που διαβάζω από τα data sources.Ανάλογα με το level of grain που έχω επιλέξει (έστω είναι ημέρα) μια συνηθισμένη δομή του πίνακα που υλοποιεί την διάσταση του χρόνου μπορεί να είναι η εξής:
SQL Script
CREATE TABLE [dbo].[DimDate]
( [DateKey] [int] NOT NULL PRIMARY KEY CLUSTERED
, [FullDateAlternateKey] [date] NOT NULL
, [DayNumberOfWeek] [tinyint] NOT NULL
, [EnglishDayNameOfWeek] [nvarchar](10) NOT NULL
, [GreekDayNameOfWeek] [nvarchar](10) NOT NULL
, [FrenchDayNameOfWeek] [nvarchar](10) NOT NULL
, [DayNumberOfMonth] [tinyint] NOT NULL
, [DayNumberOfYear] [smallint] NOT NULL
, [WeekNumberOfYear] [tinyint] NOT NULL
, [EnglishMonthName] [nvarchar](10) NOT NULL
, [GreekMonthName] [nvarchar](10) NOT NULL
, [FrenchMonthName] [nvarchar](10) NOT NULL
, [MonthNumberOfYear] [tinyint] NOT NULL
, [CalendarQuarter] [tinyint] NOT NULL
, [CalendarYear] [smallint] NOT NULL
, [CalendarSemester] [tinyint] NOT NULL
, [FiscalQuarter] [tinyint] NOT NULL
, [FiscalYear] [smallint] NOT NULL
, [FiscalSemester] [tinyint] NOT NULL
)
Σε αυτό το σημείο θα πρέπει να εξηγηθούν κάποια πράγματα σε σχέση με το παραπάνω script καθώς ίσως σε αρκετούς να τους έχουν δημιουργηθεί απορίες.Η πρώτη ίσως να είναι για το πεδίο DateKey που είναι τύπου integer και είναι και το Primary key του πίνακα. Οι τιμές που μπαίνουν σε αυτό δεν είναι κάποια απλή αρίθμηση. Είναι της μορφής ΥΥΥΥΜΜDD δηλαδή 20120101 για την 01/01/2012, 20120102 για την 02/01/2012 κ.ο.κ.Επίσης μπορεί να υπάρχουν απορίες για τα λεκτικά που αφορούν της ημέρες ή τους μήνες και τα οποία είναι σε διαφορετικές γλώσσες. Αυτό γίνεται διότι θέλω να έχω αφενός την δυνατότητα να γνωρίζω άμεσα αν είναι Δευτέρα ή Τρίτη, Ιανουάριος ή Φεβρουάριος χωρίς να κάνω κάθε φορά που χρειάζομαι κάτι τέτοιο χρήση κάποιας function, αφετέρου θέλω να μπορώ να καλύψω ανάγκες πολυγλωσσικότητας.Τέλος θα ήθελα να σας επισημάνω τα τελευταία πεδία του πίνακα τα οποία στην ουσία έχουν μπει για να καλύψουν ανάγκες όπως αυτές που έχω ήδη αναφέρει παραπάνω στον σχεδιασμό της διάστασης.
Γεμίζοντας τον πίνακα με εγγραφές
Αφού έχω καταλήξει στο σχήμα του πίνακα μου το επόμενο βήμα είναι να το γεμίσω με εγγραφές. Αυτό μπορεί να γίνει με αρκετούς τρόπους.Ένας τρόπος είναι να φτιάξω ένα T-SQL Script στο οποίο να χρησιμοποιώ τις date & time functions του SQL Server όπως τις DATEPART, DATENAME, MONTH, YEAR, DAY και με το οποίο (script) να δημιουργώ τις εγγραφές που χρειάζομαι για το επιθυμητό χρονικό διάστημα.Άλλος τρόπος είναι να χρησιμοποιήσω το Excel όπου με τις function & formulas που αυτό έχει να δημιουργήσω τις αντίστοιχες γραμμές σε αυτό και αφού ολοκληρώσω και το αποθηκεύσω να το κάνω import στην βάση μου και συγκεκριμένα στο πίνακα μου.Τέλος υπάρχει και η λύση που μου δίνεται μέσα από τα ΒΙ tools του SQL Server και συγκεκριμένα τα Microsoft SQL Server Data Tools (SSDT) ή Business Intelligence Development Studio (BIDS) όπως μέχρι πριν λίγο καιρό ονομάζονταν.
Στο παρακάτω video δείχνω τον τρόπο με τον οποίο μπορείτε να φτιάξετε ένα Time Dimension με την χρήση των SSDT.