2016-04-04 17 views
2

SparkSQLでは、2列以上の列でウィンドウクエリを定義することはできますが、これらの列に基づいてrange句を定義することはできないようです。WindowSpecで複数の範囲句を定義する方法は?

例えば、

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 

上記は失敗(おそらく構文はオフですが?指が交差...)

それは、上記と同様の単一のステートメントで行うことができますか?

答えて

0

いいえ、1つの範囲のみが許可されます。しかし、絶望しないでください。 count(*)は添加物である:

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 

範囲が重複しているので、この特定の例では、好奇心旺盛ようです。多分それがあなたの意図です。

したい場合は、あなたの質問に基づいて、私は疑問に思う:

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

意図は、一日の始まりまで開始を切り捨て、前の記録の端を保持時間の範囲で集約することです。だから、私は2つのフィルターの間の交差点を取得したいので、少し厄介です。私は、N日(00:00に始まる)から現在の時刻(今日の真中にあるかもしれない)までのすべてのレコードを元に戻したいと思います。 – taw

+0

データがばらばらになっている場合、2番目の例は素晴らしいでしょう。 – taw

+0

@taw。 。 。あなたはサンプルデータと希望の結果で別の質問をする必要があります。この質問はあなたが探しているものとはかなり違っているようです。 –

関連する問題