2016-04-04 8 views
2

SparkSQL'de 2+ sıralı sütunlarla bir pencere sorgusu tanımlamak mümkündür, ancak bu sütunlara göre aralık maddelerini tanımlamak mümkün görünmemektedir. Örneğin WindowSpec'te çoklu aralık cümleleri nasıl tanımlanır?

,

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 

yukarıda başarısız (belki sözdizimi kapalı olsa? parmaklar ... çarpı)

yukarıdakine benzer bir tek açıklamada yapılabilir mi?

cevap

0

Hayır, yalnızca bir aralık kullanılabilir. Ama umutsuzluk etme. count(*) katkı maddesidir: aralıkları örtüşen için

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 

Bu özel örnek, meraklı görünmektedir. Belki de senin niyetin budur. Sorunuzun dayanarak

, istediğin acaba:

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

niyet günün başlangıcında aşağı başlangıç ​​keser ve önceki rekor sonunu tutan bir zaman aralığı, toplanacak olan . Yani biraz garip çünkü iki filtre arasındaki kesişimi elde etmek istiyorum. Yeniden düzenlenmiş, N gününden tüm kayıtları (saat 00: 00'dan itibaren) geçerli zamana kadar (günün ortasında olabilir) kadar istiyorum. – taw

+0

Veriler ayrılırsa ikinci örneğiniz harika olurdu. – taw

+0

@taw. . . Örnek veriler ve istenen sonuçlarla başka bir soru sormalısınız. Bu soru, aradığınızdan oldukça farklı görünüyor. –