2016-04-29 7 views
0

Ich möchte in der Stream-Analyse fortlaufend wiederholte Werte zählen. Ich habe zum Beispiel einen Sensor, der jede Sekunde Werte von 0 oder 1 aufzeichnet. Ich möchte ein gleitendes Fenster von 1 Minute setzen und zählen, wenn ich mehr als 30 aufeinanderfolgende Nullen habe. Ich kann keine Nullen in einer Gruppenklausel zählen, da sie möglicherweise nicht aufeinanderfolgend sind. ZB Wenn ich habe:Zähle fortlaufende wiederholte Werte im Stream Analytics

ID Value TimeStamp 
1, 1, second 1 
2, 1, second 2 
3, 1, second 3 
4, 1, second 4 
5, 1, second 5 
6, 1, second 6 
7, 1, second 7 
8, 0, second 8 
9, 0, second 9 
10, 0, second 10 
11, 0, second 11 
12, 0, second 12 
13, 0, second 13 
14, 0, second 14 
15, 1, second 15 
16, 1, second 16, 
17, 1, second 17 
18, 1, second 18 

Ich mag erhalten:

MinId Value Count 
1, 1, 7 
8, 0, 7 
15,1, 4 

oder noch besser, würde Ich mag, dass in der gleichen Minute erhalten, dort, wo (maximal konsekutive 1 waren 7 und maximal aufeinanderfolgenden 0-en, wo 7)

MinId Value MaxCount 
1, 1, 7 
8, 0, 7 

In SQL würde ich so etwas tun:

select grp, value, min(id), max(id), count(*) as cnt, max(fecha) as Fecha 
from (select t.*, 
      (row_number() over (order by id) - row_number() over (partition by value order by id) 
      ) as grp 
     from [StockSensor] t 
    ) t 
group by grp, value 
order by min(id); 

Mit Stream Analytics haben Sie LAG-Funktion, aber ich kann keine Möglichkeit finden, die fortlaufenden Nummern zu zählen.

Irgendwelche Ideen?

+0

benötigen weitere Informationen: https: //spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ – TheGameiswar

Antwort

1

Ich glaube nicht, dass Sie die Anzahl der aufeinanderfolgenden 1er oder 0er mit den heute verfügbaren Funktionalitäten einfach zählen können. Wenn Sie jedoch alle Zeitstempel ausgeben möchten, in denen x aufeinander folgende 1s (oder 0s) waren, können Sie etwas wie unten tun.

with PreviousLookups as 
(
select 
    System.Timestamp Time, 
    Value, 
    lag(Value,1) over (limit duration(mi, 1)) ValueP1, 
    lag(Value,2) over (limit duration(mi, 1)) ValueP2, 
    lag(Value,3) over (limit duration(mi, 1)) ValueP3, 
    lag(Value,4) over (limit duration(mi, 1)) ValueP4 
from 
    iotInput timestamp by AppTimeStamp 
) 

select 
    Time 
from 
    PreviousLookups 
where 
    Value * ValueP1 * ValueP2 * ValueP3 * ValueP4 = 1 

Die obige Abfrage gibt alle Zeitstempel aus, die 5 aufeinanderfolgende 1s haben. Es kann für "Zeitstempel, in denen 30 oder mehr aufeinanderfolgende Nullen vorhanden waren" geändert werden.