Announcement

Collapse
No announcement yet.

Zeitdimension SQL Analysis Services 2008

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Zeitdimension SQL Analysis Services 2008

    Hallo,

    ich schreibe gerade meine Bachelor Thesis und habe damit angefangen mich in Microsoft Visual Studio 2008 einzuarbeiten.

    Ich habe ein Data-Warehouse generiert auf dem ein Cube aufgesetzt werden soll, das funktioniert soweit auch ganz wunderbar.

    Allerdings habe ich ein Problem mit der Zeitdimension. Im Datawarehouse ist eine Tabelle namens testRun vorhanden, die eine Spalte timestamp enthält. In dieser Spalte sind Datumswerte vom typ datetime eingetragen.

    Diese würde ich gerne in einer seperaten Zeitdimension im Cube zur Verfügung stellen, um dann über Hierarchien wie Jahr -> Halbjahr -> Monat -> ... browsen zu können. Momentan habe ich einfach nur eine viel zu lange Liste von einzelnen Zeitwerten, was ganz und gar nicht benutzerfreundlich ist

    Ich habe schon alles mögliche probiert, jedoch habe ich das Gefühl ich rate im Nebel herum. Leider habe ich noch keine richtige Anleitung gefunden, wie das genau funktioniert. Hoffe ich habs einigermaßen gut beschrieben und ihr könnt mir helfen, wäre sehr sehr dankbar !

    Viele Grüße
    Attached Files

  • #2
    Hallo,

    am einfachsten wird es sein, wenn Du mal eine Dimension als "Serverzeitdimension" anlegst (Option bei Dimensionstyp), dann generiert Dir ein Wizard alles, was Du als Vorlage verwenden kannst ... oder Du verwendest sie gleich als solche, die beinhaltet dann aber alle Datumswerte für den generierten Bereich; Deine Zeitwerte werden vermutlich Lücken aufweisen.
    Olaf Helper

    <Blog> <Xing>
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich

    Comment


    • #3
      Hallo,
      danke für die Antwort. Das hatte ich schonmal gemacht, und mir wurde in der Datenbank dann die entsprechende Tabelle angelegt. Allerdings wusste ich nichts damit anzufangen?! In der Spalte "date" standen ja dann bereits Werte drin, die ja mit meinen nix zu tun haben.

      Was heißt meine Zeitwerte weisen Lücken auf? Ich habe mal ein Screenshot von der Abfrage angehängt welche die Tabelle testRun ausgibt.

      Was muss ich mit den entsprechenden Werten in der Spalte timestamp genau machen? Muss ich diese in das generierte Schema vom Wizard einpflegen?

      Kann ich nicht auf Basis der schon vorhandenen Tabelle testRun das Schema für die Zeitdimension generieren lassen?

      Sorry für die vielen Fragen, ich blick grad überhaupt nicht durch

      grüße
      Attached Files

      Comment


      • #4
        Der Wizard legt natürlich eine Tabelle, irgendwo müssen ja die Werte gespeichert werden. Die ist aber erst mal nebensächlich.

        Der Wizard legt aber eben auch die Zeitdimension mit den Hierachien an. Dort kannst Du Dir zum einen ansehen, wie die Hierachien abgebildet werden.

        Die Dimension kannst Du aber auch gleich also solche verwenden. Du fügst sie einfach dem Cube hinzu und verbindest in der Dimensionsverwendung sie mit Deiner Datumspalte (timestamp), bzw. referenzierst sie, wenn es ein Sternschema ist.
        Olaf Helper

        <Blog> <Xing>
        * cogito ergo sum * errare humanum est * quote erat demonstrandum *
        Wenn ich denke, ist das ein Fehler und das beweise ich täglich

        Comment


        • #5
          Hallo,

          also gut, ich habe nun eine "time table on the server" erzeugt und de spalte date auf meine spalte timestamp referenziert. Siehe Screenshot. Ist das so richtig?



          Uploaded with ImageShack.us

          Problem 1: Deploy funktioniert nur wenn der Haken bei Materialize weg ist. (Was macht die Funktion?)

          Problem 2: Mache ich den Haken weg und starte dann den Deploy kann ich zwar über die Hiearchien im Browser zugreifen, aber die Werte die damit verknüpft sind stimmen überhaupt nicht überein.

          Was hab ich falsch gemacht?

          Folgende Fehlermeldung erhalte ich:

          Fehler im OLAP-Speichermodul: Der Attributschlüssel wurde bei der Verarbeitung nicht gefunden: Tabelle: Time, Spalte: Date, Wert: 01.03.2010 06:42:13. Das Attribut ist 'Date'.

          Fehler im OLAP-Speichermodul: Der Datensatz wurde ausgelassen, da der Attributschlüssel nicht gefunden wurde. Attribut: Date der Dimension: Time aus Datenbank: 2010-11-18, Cube: Data Warehouse, Measuregruppe: Measuring Value, Partition: Measuring Value, Datensatz: 1.

          Fehler im OLAP-Speichermodul: Der Attributschlüssel wurde bei der Verarbeitung nicht gefunden: Tabelle: Time, Spalte: Date, Wert: 01.03.2010 06:42:13. Das Attribut ist 'Date'.

          Fehler im OLAP-Speichermodul: Der Datensatz wurde ausgelassen, da der Attributschlüssel nicht gefunden wurde.

          Attribut: Date der Dimension: Time aus Datenbank: 2010-11-18, Cube: Data Warehouse, Measuregruppe: Measuring Value, Partition: Measuring Value, Datensatz: 1.

          Fehler im OLAP-Speichermodul: Der Verarbeitungsvorgang wurde beendet, da die Anzahl von Fehlern, die während der Verarbeitung ermittelt wurden, die für den Vorgang maximal zulässige Anzahl von Fehlern erreicht hat.

          Fehler im OLAP-Speichermodul: Fehler beim Verarbeiten der Measuring Value-Partition der Measuring Value-Measuregruppe für den Data Warehouse-Cube aus der 2010-11-18-Datenbank.

          Fehler im OLAP-Speichermodul: Der Attributschlüssel wurde bei der Verarbeitung nicht gefunden: Tabelle: Time, Spalte: Date, Wert: 01.03.2010 06:42:13. Das Attribut ist 'Date'.
          Zuletzt editiert von eKi; 18.11.2010, 15:50.

          Comment


          • #6
            Das referenziren ist soweit richtig, wobei ich nicht das gesamte Design kenne, nur den Screenshot; das sollte aber passen.

            Fehler im OLAP-Speichermodul: Der Attributschlüssel wurde bei der Verarbeitung nicht gefunden: Tabelle: Time, Spalte: Date, Wert: 01.03.2010 06:42:13. Das Attribut ist 'Date'.
            Das ist ein ganz einfacher Fehler: In den Fakten sind Werte enthalten, die es in der Dimension nicht gibt. Auf eine RDBMS abgebildet ist es einer ForeignKey Verletzung. Der Wert ist also in der Dimension "Time" nicht vorhanden, weil z.B. der Wertebereich nicht die Werte abdeckt.

            01.03.2010 06:42:13
            Du hast im Timestamp auch Uhrzeiten, sind die für die Auswertung relevant?
            Erklärt zum einen den vorherigen Punkt, die Serverzeitdimension hat nur Datumswerte ohne Uhrzeit, das kann nicht passen.
            Wenn die Uhrzeit nicht relevant ist, muss Du sie aus den Daten für den Cube entfernen, also z.B. im Dataview entfernen lassen durch entsprechende Konvertierung.
            Wird die Zeit benötigt, wird die Dimension entsprechend noch komplexer, neben den Datumshierachies werden dann auch noch solche für die Uhrzeit fällig, damit das auch noch entsprechend ausgewertet werden kann.
            Und nochmal: Die Serverzeitdimension war als Vorlage gedacht, wo Du Dir ansehen kannst, wie die Hierachien für Datumswerte abgebildet werden können.

            Wenn Du einen Cube verarbeiten lässt und dabei alle Fehler ignorieren lässt (die Option musst Du wohl gewählt haben), dann kannst Du auch kein einwandfreies Ergebnis erwarten.
            Olaf Helper

            <Blog> <Xing>
            * cogito ergo sum * errare humanum est * quote erat demonstrandum *
            Wenn ich denke, ist das ein Fehler und das beweise ich täglich

            Comment


            • #7
              Guten Morgen,

              erstmal vielen Dank für die Hilfe weiß das echt zu schätzen!

              Die Uhrzeiten sind in diesem Zusammenhang sogar sehr wichtig. Es geht darum, Messwerte von Prüfanlagen auszuwerten. Es handelt sich um etwa 200 Prüfanlagen die ausgewertet werden sollen, und es gibt nahezu zu jeder erdenklichen Uhrzeit des Tages neue Messwerte in der Datenbank.

              Kann man das denn überhaupt einigermaßen geschickt abbilden angesichts der Menge an Datums UND Zeitwerten?

              Comment


              • #8
                Wenn die Uhrzeiten benötigt werden, dann musst Du eine eigene Serverzeit-Dimension erstellen.

                Ich finde es nur sehr ungewöhnlich, den in einem Cube interessiert einen sehr selten solch ein Detailierungsgrad, da möchte man eher kumuliert auswerten.

                Bist Du sicher, das ein Cube für Deine Lösung die beste Variante ist? Für mich hört es sich eher nach einfachem Reporting in Listenform an.
                Olaf Helper

                <Blog> <Xing>
                * cogito ergo sum * errare humanum est * quote erat demonstrandum *
                Wenn ich denke, ist das ein Fehler und das beweise ich täglich

                Comment


                • #9
                  Zugegeben, die Cube-Technik ist für diesen Bereich sehr ungewöhnlich. Das ist auch ein erstes Fazit von mir. Die großen Stärken von OLAP, in dem Daten aggregiert werden und man über verschiedene Zeiträume Trends und Entwicklungen erkennen kann, werden gar nicht genutzt.

                  Aber es war die Aufgabenstellung des Unternehmens herauszufinden was in diesem Bereich möglich ist.

                  Und im Vergleich zu den bisherigen Analysemöglichkeiten der (Mess-)Daten bringt es dem Unternehmen gewisse Vorteile. Aber: wenn ein anderes geeignetes Frontend mit entsprechenden Funktionen vorhanden wäre, weiß ich nicht ob man an dieser Stelle von einem Benefit durch OLAP sprechen könnte.

                  Ich versuch mal das beste drauszumachen, falls nochmal Fragen aufkommen melde ich mich wieder

                  Comment


                  • #10
                    Hallo,

                    bin wieder da. :-) Bin zwar weitergekommen, aber hinsichtlich der Time Dimension konnte ich noch keine Gescheite Lösung finden.

                    Wie bekomm ich es denn hin, dass der Assistent mir diese Tabellen erstellt, auf Basis meiner Datumswerte?

                    Ich finde nirgends eine anständige Anleitung. Wär für eine Step by Step Erklärung unendlich dankbar.

                    Vielen Dank und viele Grüße!




                    Uploaded with ImageShack.us

                    Comment


                    • #11
                      Wozu sollte der (riesen) Screenshot gut sein, die Tabelle kenne ich auch so?

                      Über den Wizard kannst Du keine Zeitdimension mit Uhrzeiten erstellen, die musst Du selbst erstellen.
                      So schwierig sollte es eigentlich nicht sein. Du nimmst die Tabelle und erweiterst sie um Attribute für die Uhrzeit.
                      Eigentlich füllt man die dann mit allen möglichen vorkommenden Werten; bei rein Datum sind das 365 (366) Tage je Jahr, kein Problem, wenn Uhrzeit hinzukommt, vergessen wir das erst mal.
                      Also musst Du die Tabelle mit Werten aus der Faktentabelle füllen.

                      Zu Demo lege ich mit mal eine kleine Faktentabelle an:
                      [highlight=SQL]
                      SET NOCOUNT ON;
                      -- Nur zur Demo: Faktentabelle mit Datum-Uhrzeit
                      CREATE TABLE #Fakten
                      (DatumUhrzeit datetime NOT NULL);
                      GO
                      -- Demo Werte
                      ;with dates
                      AS (
                      SELECT object_id AS id
                      ,create_date AS date1
                      ,modify_date AS date2
                      ,DATEADD(ms, object_id, create_date) AS date3
                      ,DATEADD(ms, - object_id / 4, create_date) AS date4
                      ,DATEADD(ms, object_id / 5, modify_date) AS date5
                      ,DATEADD(ms, - object_id / 6, modify_date) AS date6
                      FROM msdb.sys.objects)

                      INSERT INTO #Fakten (DatumUhrzeit)
                      SELECT DISTINCT date1
                      FROM ( SELECT date1 FROM dates
                      UNION SELECT date2 FROM dates
                      UNION SELECT date3 FROM dates
                      UNION SELECT date4 FROM dates
                      UNION SELECT date5 FROM dates
                      UNION SELECT date6 FROM dates
                      ) AS SUB
                      GO
                      [/highlight]
                      Ich komme so auf 4k Datensätze, reicht erst mal.

                      Nun eine Mini-Ausgabe der Dimensionstabelle:
                      [highlight=SQL]
                      -- Anlage Dimension-Tabelle
                      IF NOT OBJECT_ID('dbo.Dim_DateTime', 'U ') IS NULL
                      DROP TABLE dbo.Dim_DateTime;
                      GO
                      CREATE TABLE dbo.Dim_DateTime
                      (id datetime NOT NULL PRIMARY KEY
                      ,Jahr smallint NULL
                      ,Monat tinyint NULL
                      ,Tag tinyint NULL
                      ,Stunde tinyint NULL
                      ,Minute tinyint NULL
                      ,Sekunde tinyint NULL
                      ,DatumUhrzeit char(19)
                      ,Datum char(10)
                      ,Uhrzeit char(8)
                      );
                      GO
                      [/highlight]

                      Die Tabelle musst Du dann mit eindeutigen Werten aus den Fakten füllen; je nach Anzahl kann das etwas dauern. In der Regel erledigt man so einen ETL Prozess mit SSIS, der einfachkeit halber mal per einfaches SQL.
                      Beim Füllen werden dabei bereits die einzelnen Attribute erstellt:
                      [highlight=SQL]
                      -- ETL Prozess; Dimension aus Fakten füllen
                      TRUNCATE TABLE dbo.Dim_DateTime;

                      ;WITH dates(id)
                      AS (SELECT DISTINCT DatumUhrzeit AS id
                      FROM #Fakten)

                      -- Attribute aufbauen
                      INSERT INTO dbo.Dim_DateTime
                      ( id
                      ,Jahr
                      ,Monat
                      ,Tag
                      ,Stunde
                      ,Minute
                      ,Sekunde
                      ,DatumUhrzeit
                      ,Datum
                      ,Uhrzeit)
                      SELECT id
                      ,YEAR(id)
                      ,MONTH(id)
                      ,DAY(id)
                      ,DATEPART(hh, id)
                      ,DATEPART(mm, id)
                      ,DATEPART(ss, id)
                      ,CONVERT(varchar(19), id, 120)
                      ,CONVERT(varchar(10), id, 120)
                      ,CONVERT(varchar(8), id, 114)
                      FROM dates;

                      -- Selektion zur Kontrolle
                      SELECT *
                      FROM dbo.Dim_DateTime;

                      GO
                      -- Aufräumen
                      DROP TABLE #Fakten;
                      [/highlight]

                      Im SSAS Projekt nimmst Du die Tabelle in die Datenquellsicht auf und erstellst dann die Dimension. Das modellieren der Hierachien hängt dann etwas davon ab, wieviele Daten Du hast.
                      Du könntest Jahr=>Monat=>Datum=>Uhrzeit bilden
                      Oder wenn es viele Werte sind eine tiefere, also
                      Datum=>Stunde=>Minute=>Sekunde
                      Olaf Helper

                      <Blog> <Xing>
                      * cogito ergo sum * errare humanum est * quote erat demonstrandum *
                      Wenn ich denke, ist das ein Fehler und das beweise ich täglich

                      Comment


                      • #12
                        Hallo Olaf,

                        zunächst mal riesigen Dank für deine Mühe und Aufwand! Habe es mit Hilfe von deinen Scripts hinbekommen meine Datumswerte in einzelne Teile zu zerlegen, und beginne nun damit die Hierarchien in SSAS zu bauen.

                        DANKE!!

                        Comment

                        Working...
                        X