Kategoriarkiv: How-to

Generera datumdimension i SQL server

Hur man genererar en datumdimension i SQL server med ett rekursivt CTE uttryck

Datumdimensionen

Kanske är datumdimensionen den vanligast förekommande dimensionen i en stjärnmodell.  Till skillnad från de flesta övriga dimensioner härstammar inte dimensionsmedlemmarna från ett källsystem. Medlemmarna är givna utifrån den gregorianska tideräkning som används i vår del av världen. Följaktligen är dimensionens utseende snarlikt mellan olika stjärnmodeller. Många BI-utvecklare anser därför att det smidigaste sättet att skapa datumdimensionstabellen är att kopiera den från en annan, redan existerande, stjärnmodell. Nedan tittar vi på ett alternativ till kopierametoden, en metod där datumdimensionen genereras i T-SQL kod.

CTE

Införandet av CTE´s i 2005 versionen av SQL server innebar att vi slapp ofoget med subselects och att vi fick bättre strukturerad och mer lättläst kod. Med CTE´s kom också möjligheten att skriva rekursiva uttryck.  Med rekursiva CTE uttryck är det möjligt att generera rader utan att referera till en tabell.

Följande enkla kodsnutt använder ett rekursivt CTE uttryck för att skapa en datumdimensionstabell.

DECLARE @tDateDay AS DATE = > ’1990-01-01′;

WITH dimDate_CTE AS (
SELECT dateDay = @tDateDay

UNION ALL

SELECT  dateDay = DATEADD(d,1,dateDay)
FROM
dimDate_CTE
WHERE
dateDay<= ’2019-12-31′)

SELECT
dimDateKey = ROW_NUMBER() OVER(ORDER BY dateDay),
dateID =CONVERT(INT,CONVERT(NVARCHAR(8),dateDay,112)),
dateDay = dateDay,
dateDayOfWeek = CONVERT(SMALLDATETIME,DATEPART(DW,dateDay)),
dateWeekNo = CONVERT(SMALLINT,DATEPART(WK,dateDay)),
dateMonthNo = CONVERT(SMALLINT,DATEPART(M,dateDay)),
dateQuarter = CONVERT(SMALLINT,DATEPART(Q,dateDay)),
dateYear = CONVERT(INT,DATEPART(YY,dateday))
INTO dimDate
FROM dimDate_CTE
OPTION (MAXRECURSION 11000)

Vi vill börja generera medlemmar från 1990-01-01. Första raden kod tilldelar detta värde till en lokal variabel. Notera att första raden kod endast fungerar i 2008 versionen eller senare av SQL server. I tidigare versioner existerar inte DATE datatypen. Det går inte heller, i tidigare versioner, att tilldela en lokal variabel ett värde på samma rad som den deklareras.

CTE uttrycket görs rekursivt genom att den andra SELECT frågan i en UNION ALL refererar till den första. Med andra ord, CTE uttrycket anropar sig själv. För varje anrop adderar vi en dag till startdatumet.

WHERE satsen i den andra SELECT frågan är vårt terminerings villkor. Vi vill fortsätta att addera en dag till startdatumet till det når 2019-12-31.

I den nedre SELECT frågan, som refererar till CTE uttrycket, skapar vi de dimensions attribut som vi finner relevanta. Alla attributen baseras på datum. Genererade rader lagras i tabellen dimDate.

Ett rekursivt CTE uttryck får som default endast anropa sig själv 100 gånger, detta för att man inte av misstag skriver uttryck som anropar sig själv i oändlighet. Sista raden kod är en query hint som tillåter rekursiva CTE uttryck, tillhörande denna SELECT sats, att anropa sig själva som mest 11000 gånger. Eftersom vi vet att det är 10958 dagar mellan vårt startdatum och vårt slutdatum känns 11000 som en bra siffra.


Spatiala data i Microsoft SQL server 2008 – Del 5

I vårt sista planerade inlägg i spatialdata-serien tittar vi på ett exempel som visar på vad lite som krävs för att lösa ett ganska knivigt problem och inte minst hur snyggt man faktiskt kan visualisera resultatet i en karta. Läs mer


Spatiala data i Microsoft SQL server 2008 – Del 4

I denna fjärde del i vår serie om spatialdata i Microsoft SQL Server 2008  tittar vi lite mer på hur det ser ut och fungerar i Management Studio och skriver lite mer kod. Vi tittar också på Microsofts webservice MapPoint. Läs mer


Calculated measures och query scoped members

Calculated Measures är en kraftfull funktion i OLAP-kuber som används för att utöka kubfunktionalitet genom att kombinera vanliga measures och dimensioner med varandra. En calculated measure definieras i själva kuben medans en query scoped member å andra sidan definieras i en query. Ibland kan en query scoped member vara enda utvägen beroende på användarrättigheter eller p.g.a. prestandaskäl. Läs mer


Använda MDX för rullande totaler relativa till dags datum

Om det är en sak jag lärt mig under min IT-karriär så är det att chefer och räknenissar älskar löpande totaler och snittvärden.

Behoven kan variera något beroende på verksamhetstyp, en revisor eller financial controller är oftast intresserad av löpande totaler som visar endast stängda böcker, vilket i praktiken betyder att man jämför månaden innan nuvarande med föregående. Inom detaljhandeln stänger man sina försäljningsresultat varje dag och är därför intresserad av att jämföra gårdagens resultat med föregående dagar. Läs mer


Spatiala data i Microsoft SQL server 2008 – Del 3

I det tredje inlägget i vår serie om spatialdata tittar vi lite närmare på metoder och egenskaper samt hur saker och ting faktiskt ser ut i Management Studio. Läs mer


Spatialdata i Microsoft SQL Server 2008 – Del 2

I detta inlägg kikar vi närmare på vilka skillnaderna är mellan de två spatialdatatyperna, vad ett spatialt referenssystem är för något samt vilka geometriska former som stöds. Läs mer


Egna anpassningar för Integration Services, Del 1

Detta är första delen av en serie inlägg som ska handla om hur vi kan skriva egna anpassningar till Microsoft SQL Server 2008 R2 Integration Services (SSIS). Integration Services är en mycket kompetent produkt i sig och innehåller att antal fördefinierade komponenter i verktygslådan såsom datakällor och destinatinationer eller programflödeskomponenter för att loopa igenom filer i en mapp och så vidare. Mest grundläggande är så klart de komponenter som är till för att manipulera data och det är också dessa komponenter vi är bäst bekant med då vi bygger ETL-processer för våra Datalager.

Jag vill i denna serie av inlägg visa att det med ganska enkla medel går att anpassa och bygga ut funktionaliteten i SSIS genom att utveckla egna komponenter. I första steget ska vi dra upp grunden för hur vi kan skapa en egenutvecklad Control Flow task. Läs mer


Spatialdata i Microsoft SQL Server 2008 – Del 1

I fem inlägg kommer vi att titta närmare på implementationen av spatialdata i Microsoft SQL server 2008. Dagens inlägg kommer att diskutera data-visualisering generellt samt den standard för spatiala data som Microsoft valt att implementera.

Datavisualisering

Datavisualisering är ett begrepp som diskuteras allt flitigare i business intelligence- sammanhang. Det efterfrågas i allt större utsträckning alternativ till traditionella tabeller och diagram för att presentera data. Microsoft har svarat upp med att lansera ett flertal intressanta komponenter som möjliggör avancerad visualisering. Exempel är decomposition tree för visualisering av hierarkisk data och Pivot viewer för att kunna kombinera siffror, text och bilder i samma vy (denna mycket intressanta Silverlightkomponent som tillämpar deep zoom-teknik kanske vi får tillfälle att återkomma till i ett framtida inlägg). Det som ändå efterfrågas mest är visualisering av data i kartor.

Ett mer korrekt ord för kartdata är spatialdata. Spatialdata beskriver position, form och orientering av objekt som befinner sig någonstans inom rummets tre dimensioner. Den vanligaste formen av spatialdata är geospatiala data som beskriver objekt placerade någonstans på jorden. Microsoft har på kort tid lanserat molntjänsten MapPoint samt infört stöd för spatialdata i både .net och SQL Server. Vi ska titta närmare på implementeringen av de två spatiala datatyperna i SQL Server 2008, geometry och geography. Läs mer


Följ

Få meddelanden om nya inlägg via e-post.