2016-04-04 5 views
2

In SparkSQL ist es möglich, eine Fensterabfrage mit Spalten 2+ nach Spalten zu definieren, aber es scheint nicht möglich zu sein, Bereichsklauseln basierend auf diesen Spalten zu definieren.Wie definiert man mehrere Bereichsklauseln in WindowSpec?

Zum Beispiel

select 
row_id, 
count(*) over (
    partition by group_id 
    order by filter_key1, filter_key2 
    range between 12 preceding and 12 following 
    range between 5 preceding and 1 preceding 
) as the_count 
from table 

Die obige fehlschlägt (wenn auch vielleicht die Syntax aus? Daumen ...)

Kann es in einer einzigen Anweisung ähnlich der oben getan werden?

Antwort

0

Nein, nur ein Bereich ist erlaubt. Aber verzweifle nicht. count(*) ist additiv:

select row_id, 
     (count(*) over (partition by group_id 
         order by filter_key1, filter_key2 
         range between 12 preceding and 12 following 
        ) + 
     count(*) over (partition by group_id 
         order by filter_key1, filter_key2 
         range between 5 preceding and 1 preceding 
        ) 
     ) as the_count 
from table 

Dieses spezielle Beispiel scheint neugierig, weil die Bereiche überlappen. Vielleicht ist das deine Absicht.

Basierend auf Ihrer Frage, frage ich mich, wenn Sie wollen:

select row_id, 
     (count(*) over (partition by group_id 
         order by filter_key1 
         range between 12 preceding and 12 following 
        ) + 
     count(*) over (partition by group_id 
         order by filter_key2 
         range between 5 preceding and 1 preceding 
        ) 
     ) as the_count 
from table 
+0

Die Absicht eine Reihe von Zeit zu aggregieren ist vorbei, die bis zum Beginn des Tages des Start abschneidet und halten das Ende an dem vorhergehenden Rekord . Also, ein bisschen peinlich, weil ich den Schnittpunkt zwischen den beiden Filtern bekommen möchte. Angepasst, ich möchte alle Datensätze von N Tagen zurück (beginnend um 00:00) bis kurz bis zur aktuellen Zeit (die in der Mitte des Tages sein könnte). – taw

+0

Ihr zweites Beispiel wäre toll, wenn die Daten disjunkt wären. – taw

+0

@ tau. . . Sie sollten eine andere Frage mit Beispieldaten und gewünschten Ergebnissen stellen. Diese Frage scheint ganz anders zu sein als das, wonach Sie suchen. –