2017-11-28 1 views
0

ich SSMS gerade arbeite 2012.Verbesserung der Verbindungen zwischen Facttable und Dimensionen

ich Facttable zusammen mit seinen Dimensionen erstellt haben, sowohl mit einem ParentID Beziehung. Ich habe Views erstellt, die die Factable und die Dimensionen benutzerfreundlicher darstellen (einfach Dinge aufheben). Alles funktioniert fehlerfrei, wenn ich LEFT OUTER JOIN verwende, um Informationen aus diesen Ansichten zu erhalten.

Das Ding ist in einigen meiner Dimensionen, ich habe eine n-zu-1-Beziehung in Bezug auf meine Factable. Zum Beispiel habe ich allgemeine Informationen über ein Unternehmen in meiner Factable und den täglichen Wert seines Bestands in der Dimension gespeichert.

Das "Problem" ist, wenn ich den LINKEN ÄUSSEREN JOIN der Ansichten mache Ich habe viele redundante Informationen auf dem linken Teil der Tabelle (entsprechend den allgemeinen Informationen über das Unternehmen).

Ihnen eine Vorstellung zu geben:

NAME  CITY  DATE   STOCK_PRICE 
    Alpha  Tokyo  05/01/2017  2.2 
    Alpha  Tokyo  04/01/2017  2.3 
    Alpha  Tokyo  03/01/2017  2.1 
    Alpha  Tokyo  02/01/2017  2.0 
    Alpha  Tokyo  01/01/2017  2.4 

Ich weiß, dass NULL-Werte in einer Art und Weise effizienter gehandhabt werden als „tatsächliche“ Werte. Die Idee wäre, so etwas zu erreichen.

NAME  CITY  DATE   STOCK_PRICE 
    Alpha  Tokyo  05/01/2017  2.2 
    NULL  NULL  04/01/2017  2.3 
    NULL  NULL  03/01/2017  2.1 
    NULL  NULL  02/01/2017  2.0 
    NULL  NULL  01/01/2017  2.4 

Im besten Fall würde die Idee für mehr „redundant“ info vom Facttable und verschiedenen Dimensionen (wenn unterschiedliche Preise pro Tag für die gleiche Firma vorhanden ist, würde das gleiche Datum nur einmal vorkommen und dann machbar sein wäre NULL)

Hier ist meine Idee, aber fühlen Sie sich frei, Ihre Meinung zu diesem Thema zu geben. Der Kern ist wirklich, meine großen 1-zu-n-Beziehungen zu vermeiden, damit es für meinen Computer schwer wird.

+0

Wirklich, was Sie scheinen zu fragen ist, "wie kann ich nur die letzte Zeile aus meiner Unternehmen Tabelle bekommen" - eine Frage, die oft gefragt wurde (ca. 73.000 scheint es) .. Google für 'site: stackoverflow .com neueste Zeile " –

+0

Bearbeiten Sie Ihre Frage und zeigen Sie die Abfrage, die Sie verwenden, und die Ergebnisse, die Sie möchten. –

+0

Es ist ein bisschen schwer zu verstehen, was Sie eigentlich fragen. Es scheint, dass Sie sich Sorgen machen, dass sich die Strings immer wieder wiederholen, was zu Problemen mit dem verfügbaren Speicher auf Ihrem Computer führen kann. Sie würden jedoch nicht alle Unternehmen mit all ihren Daten auswählen. Wir sprechen also nicht von Milliarden von Reihen, sondern vielleicht von einigen Hundert oder Tausend. Und das ist sicher kein Problem. Also würde ich sagen, streichen Sie Ihre Sorgen weg :-) –

Antwort

0

Ich habe keine Ahnung, was das bedeutet:

Ich weiß, dass NULL ist in einer Art und Weise effizienter gehandhabt werden als „tatsächliche“ Werte. Die Idee wäre, so etwas zu erreichen.

Das ist nichts, was ich "weiß".

Wenn Sie nur Werte für die letzte Zeile wünschen, können Sie dies mit row_number() tun. Ich empfehle dies nicht, aber die SQL wie folgt aussieht:

with t as (
     <your query here> 
    ) 
select (case when seqnum = 1 then name end) as name, 
     (case when seqnum = 1 then city end) as city, 
     date, stock_price 
from (select t.*, 
      row_number() over (partition by name, city order by date desc) as seqnum 
     from t 
    ) t 
order by name, city, seqnum; 

Der Grund, warum ich nicht zu empfehlen ist, dass SQL Ergebnismengen sind in der Regel ungeordnet. Indem Sie Werte ersetzen, erzwingen Sie eine Reihenfolge in der Ergebnismenge. Ich habe die Abfrage angepasst, um eine explizite order by zu haben, also sind die Reihen wie Sie erwarten würden.

Verwandte Themen