sqlschool.gr logo

articles

Articles of SQLschool.gr Team

Designing and Implementing Time Dimensions

Antonios Chatzipavlis
Wednesday 28 March 2012

Είναι σπάνιο το φαινόμενο σε μια λύση 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.

Antonios Chatzipavlis

Antonios Chatzipavlis

Antonios is a Data Solutions Consultant and Trainer. He has been working in IT since 1988. In his career, he has worked as senior developer, IT Manager, Solutions Architect and IT Consultant. Since 1995 he has been devoted on new technologies and software development tools, mainly by Microsoft, either by training company staff and colleagues or assisting them in design, development and implementation as a consultant or chief developer. He has focused in Databases and Data Science since 1995. He specialized in Microsoft SQL Server since version 6.0 in areas like SQL Server Internals, Database Design and Development, Business Intelligence and in 2010 he has started working with Azure Data Platform, NoSQL databases, Big Data Technologies and Machine Learning. He is an active member of many IT communities in Greece, answering colleagues' questions and writing articles in his web site. He is the owner of SQLschool.gr which is a community portal with a lot of information about Microsoft SQL Server. He has been a Microsoft Certified Trainer (MCT) since 2000. Microsoft honored him as MVP on Data Platform due to his activities in SQL Server since 2010. He holds a large number of Microsoft Certifications and Microsoft SQL Server Certifications since version 6.5.

Episode

Introduction to Microsoft Fabric

image

More Episodes...

Tip

Refresh Intellisence in SSMS

Για να κάνουμε refresh το intellisence μέσα στο SSMS αρκεί να πατήσουμε Ctrl+Shift+R

More Tips...

Become a member

If you want to receive updates from us become a member to our community.

Connect

Explore

Learn


sqlschool.gr © 2010-2023 All rights reserved

This site uses cookies for operational and analytics purposes only. By continuing to browse this site, you agree to their use.