2017-11-15 3 views
0

ich einen großen historisierte Schlüssel-Wert-Speicher in der folgenden Form haben:SQL Server Verschwenkung wie HBase

╔════════════╦═══════════════╦════════╦════════════╗ 
║ Product_ID ║ Key   ║ Value ║ Date ║ 
╠════════════╬═══════════════╬════════╬════════════╣ 
║   1 ║ Brand   ║ Foo ║ 01.11.2017 ║ 
║   1 ║ Product Group ║ Health ║ 02.11.2017 ║ 
║   1 ║ Brand   ║ Bar ║ 07.11.2017 ║ 
╚════════════╩═══════════════╩════════╩════════════╝ 

Jetzt muss ich mit Product_ID und Datum als Zeilen und die Schlüssel, die Tabelle in eine Pivot-artige Struktur zur Umsetzung als Spalten. Aber ... alte Daten beibehalten, wenn sie nicht aktualisiert werden.

Dies ist perfekt in HBase, wo jemand Milliarden von Zeilen und Millionen von Spalten speichern kann. Es zeigt nur die letzten gültigen Daten für ein bestimmtes Datum in der Vergangenheit, obwohl sie zu diesem Zeitpunkt nicht aktualisiert werden.

So sollte das Ergebnis etwa so aussehen.

╔════════════╦════════════╦═══════╦═══════════════╗ 
║ Product_ID ║ Date ║ Brand ║ Product Group ║ 
╠════════════╬════════════╬═══════╬═══════════════╣ 
║   1 ║ 01.11.2017 ║ Foo ║ NULL   ║ 
║   1 ║ 02.11.2017 ║ Foo ║ Health  ║ 
║   1 ║ 07.11.2017 ║ Bar ║ Health  ║ 
╚════════════╩════════════╩═══════╩═══════════════╝ 

Wie Sie für die 2017.11.02 die Marke und für die 2017.11.07 Gesundheit ist sehen von der vorherigen Reihe genommen. Persistente Daten im Laufe der Zeit.

Ist jemand auf eine solche Anfrage gestoßen oder arbeitet er intensiv mit Schlüssel-Wert-Speichern zusammen und hat einen Zeiger, wie es funktionieren könnte?

Antwort

0

ist hier ein Ansatz unter Verwendung case Ausdruck, wenn Sie pivot

;with cte as 
(SELECT Product_ID, 
     [Date], 
     CASE ([Key]) when 'Brand' then Value END  [Brand], 
     CASE ([Key]) when 'Product Group' then Value END  [Product Group], 
     row_number() over (order by (select 1)) rn FROM <table_name>), 
     cte1 as 
     (
     SELECT Product_ID, [Date], 
     CASE ([Key]) when 'Brand' then Value END  [Brand], 
     CASE ([Key]) when 'Product Group' then Value END  [Product Group], 
     row_number() over (order by (select 1)) rn 
     FROM <table_name> 
    ) 
SELECT 
     T.Product_ID, 
     T.[Date] 
    ,CASE WHEN 
    T.Brand IS NULL THEN 
     (SELECT TOP 1 Brand FROM cte1 WHERE rn<T.rn AND Brand IS NOT NULL ORDER BY rn DESC) 
    ELSE T.Brand 
END AS Brand 
,CASE WHEN 
    T.[Product Grou] IS NULL THEN 
     (SELECT TOP 1 [Product Group] FROM cte1 WHERE rn<T.rn AND [Product Group] IS NOT NULL ORDER BY rn DESC) 
    ELSE T.[Product Grou] 
END AS [Product Group] 
FROM cte T 

Ergebnis nicht hinwollen:

Product_ID Date  Brand Product Group 
1   01.11.2017 Foo  NULL 
1   02.11.2017 Foo  Health 
1   07.11.2017 Bar  Health 
+0

Vielen Dank für Ihre Lösung. Hoch geschätzt! –