2016-05-18 6 views
2

入力に2つの値を持つフィールド '条件'があります。値 'A'または 'B'のみを仮定します。条件に一致するイベントが1つでも見つかった場合は、条件の出力イベントのみを出力し、それ以外の場合は入力を

転倒ウィンドウ内で条件= Aのイベントが少なくとも1つ検出された場合、条件= Aのイベントのみを出力する必要があります。ただし、Aのイベントが見つからない場合は、Bを持つイベントのみを同じウィンドウに出力する必要があります。 は4ティックのタンブリングウィンドウで次の入力を考える:

Condition Time 
----------- ------ 
    A   T1  
    B   T2  
    A   T3  
    B   T5  
    B   T6  
    B   T7  
    B   T8  
    B   T10 
    A   T11 
    A   T12 
    A   T13 
    A   T14 
    A   T15 

次のように出力は次のようになります。

Condition Time (Window) 
----------- ------ ---------- 
    A   T1  T1-3  
    A   T3  T1-3  
    B   T5  T5-8  
    B   T6  T5-8  
    B   T7  T5-8  
    B   T8  T5-8  
    A   T11 T9-12  
    A   T12 T9-12  
    A   T13 T13-16  
    A   T14 T13-16  
    A   T15 T13-16  

を次の出力は、私の入力から私のセットアップ私のステップ達成されることができるようにどのように? グループを使用していくつかのオプションを試しましたが、失敗しました

答えて

1

これは興味深い問題です。 最初にウィンドウの定義を修正できるようにします。 0から16までの時間範囲の4つのティックのウィンドウは、

(0 - 4] 
(4 - 8] 
(8 - 12] 
(12 - 16] 

です。開始時間は除外され、終了時間が含まれます。終了時刻は、そのウィンドウに対する計算結果のタイムスタンプです。

ここであなたの答えを計算するクエリです。

WITH 
count_as as (
    SELECT 
     cnt = SUM(case cond when 'A' then 1 else 0 end) 
    FROM input TIMESTAMP BY time 
    GROUP BY tumblingwindow(second, 4) 
) 

SELECT 
    input.cond, input.time 
FROM 
    count_as a 
     JOIN 
    input TIMESTAMP BY time 
     ON DATEDIFF(second, input, a) >= 0 AND DATEDIFF(second, input, a) < 4 
WHERE 
    (a.cnt > 0 AND input.cond = 'A') 
    OR 
    (a.cnt = 0 AND input.cond = 'B') 

count_asステップは、ウィンドウ内のAの数を計算します。これにより、ウィンドウの各端(この例では4,8,12、および16秒)にイベントが生成され、最後の4秒間にAの数が表示されます。

次に、それをinputに戻しますが、その最後の4秒です。 そして、ウインドウの境界線に正しく合わせるために、タイム・バウンド(別名ウィグル・ルーム)を慎重に定義する必要があります。したがって、betweenの代わりに>=0 and <4を使用してください。

+0

SUMを使用して特定の条件の数を数えることによって、非常に巧妙なトリックです。 – Waaghals

関連する問題