2016-01-20 7 views
5

Nach dem post von Chris Web Ich bin auf der Suche nach einem schnellen Weg, um den letzten Kauf von einem Kunden zu finden.MDX Query, um den letzten überhaupt nicht leeren Wert in icCube zu finden

Ich verwende eine MDX-Anweisung wie folgt aus:

WITH FUNCTION previous_buys() AS tail(nonempty({NULL:[Time].[Time].currentmember.prevmember} ,[measures].[sales amt]),1) 
MEMBER [last buy] as previous_buys().(0).key 

select [measures].[last buy] on 0 
,  [Customers].[Customers].[name].members on 1 
from [Store Sales] 
where [Time].[Time].[day].&[2015-12-20T00:00:00.000] 

Das wie erwartet gibt, aber es ist eine sehr lange Zeit. Gibt es eine einfache Möglichkeit, diese Anfrage irgendwie zu beschleunigen? Da icCube etwas anders ist als Microsoft MDX, kann ich nicht einfach die Lösung von Chris Web kopieren.

Irgendwelche Ideen?

Antwort

2

Das Hauptproblem, das wir mit dieser Lösung haben werden, ist die Skalierbarkeit, da wir {NULL: [Time]. [Time] .currentmember.prevmember} Zählmitglieder bewerten.

Ich dachte, dass die Verwendung einer Reverse mit einer Head-Funktion nicht die gesamte Menge auswerten würde, aber die aktuelle Implementierung der Empty-Funktion "materialisiert" die Menge. Das bedeutet, dass wir alle Mitglieder bewerten. Noch keine gültige Lösung.

Eine andere Lösung und eleganter ist die Verwendung einer rekursiven Funktion. Dies sollte die Anzahl der evaluierten Mitglieder drastisch reduzieren.

WITH 
    FUNCTION previous_buys(t_) AS IIF((t_,[Measures].[Amount]) = NULL, previous_buys(t_.prevMember), t_) 
    MEMBER [last buy] as previous_buys([Time].[Calendar].current).name 

SELECT 
    [measures].[last buy] on 0, 
    [Customers].[Geography].[Region] on 1 
FROM [Sales] 
WHERE [Time].[Calendar].[Year].[2006].[Q1 2006].[Jan 2006].[8 Jan 2006] 

Wenn Sie eine Menge von leeren Daten haben könnten Sie ein bisschen den Algorithmus kompliziert zu einem Monat Ebene hinunter zur Leere zu überprüfen. Dies wird einen ganzen Monat in einer Iteration anstatt der 30/31, die wir in der Tagesversion haben werden, auswerten.


Die letzte und schnellste um eine Größenordnung basiert auf der Aggregation-Engine von icCube. Was wir hier wollen, ist eine Kennzahl, die den letzten existierenden Tag zurückgibt.

Die Idee wäre, eine Kennzahl mit einem Datum als Eingabewert und max als Aggregationsmethode hinzuzufügen. Dann würden wir eval - wichtig, da wir den Teilcache zwischenspeichern - mit diesem neuen Maß am Set verwenden.

+0

Danke für diese Lösung. Es hilft schon sehr viel! – Arthur

0

Dies ist relativ schnell mit SSAS gegen AdvWrks. Ich amalgamiert Sie zwei benutzerdefinierte Strukturen (& benötigt, um von FUNCTION zu ändern, da ich nicht glaube, dieser Teil der MS-Implementierung von mdx ist):

WITH 
    MEMBER [Measures].[previous_buys] AS 
    Tail 
    (
     NonEmpty 
     (
     {NULL : [Date].[Calendar].CurrentMember.PrevMember} 
     ,[Measures].[Internet Sales Amount] 
    ) 
    ).Item(0).Item(0).Member_Key 
SELECT 
    NON EMPTY 
    [Measures].[previous_buys] ON 0 
,NON EMPTY 
    [Product].[Product Categories].[Product] ON 1 
FROM [Adventure Works] 
WHERE 
    [Date].[Calendar].[Date].&[20071015]; 

Es ergibt sich folgende:

enter image description here

+0

FUNCTION ist eine Möglichkeit, wiederverwendbaren Code in icCube zu erstellen, praktisch, wie Sie es auf Schemaebene deklarieren können. – ic3

+0

whyteq, auf unseren Demo-Schemata dauert auch eine Sekunde Sekunde ;-) – ic3