2017-07-21 3 views
0

Ich versuche, Open, Low, High und Close-Werte für Aktienkurse mit Azure Stream Analytics SQL zu berechnen.Azure Streaming Analytics Berechnen OHLC

Ich kann Min und Max ziemlich leicht bekommen, aber ich habe Schwierigkeiten herauszufinden, wie Open (FIRST) und Close (LAST) eines TumblingWindow berechnet werden.

Ich habe die Dokumentation hier (https://docs.microsoft.com/en-us/azure/stream-analytics/stream-analytics-stream-analytics-query-patterns) zuerst und zuletzt gefunden, aber ich kann sie nicht zu einer einzigen Abfrage kombinieren.

Hier ist, was ich habe:

SELECT 
    DateAdd(second,-5,System.TimeStamp) as WinStartTime, 
    system.TimeStamp as WinEndTime, 
    exchange, 
    Max(price) as H, 
    Min(price) as L, 
    Count(*) as EventCount 
FROM [input1] 
GROUP BY TumblingWindow(second, 5), exchange 

Ich bin nicht sehr fortgeschritten in SQL, aber gibt es eine Möglichkeit, dies in einer einzigen Abfrage zu kombinieren? Auch bei der Verwendung von Unterabfragen.

Hinweis: 5 Sekunden ist nur ein Beispielfenster, das ich zum Testen ausgewählt habe.

Antwort

0

Gemäß Ihrem Szenario ging ich davon aus, dass Sie die Collect Aggregatfunktion und user-defined functions von Azure Stream Analytics nutzen können, um Ihren Zweck zu erreichen. Hier sind die Details, können Sie sich auf sie beziehen:

Angenommen, Ihre Eingabe sieht wie folgt aus:

[ 
{"price":1.1,"exchange":10,"Time":"2017-7-24T13:00:00Z"}, 
{"price":1.2,"exchange":20,"Time":"2017-7-24T13:04:00Z"}, 
{"price":1.4,"exchange":40,"Time":"2017-7-24T13:03:00Z"}, 
{"price":1.3,"exchange":30,"Time":"2017-7-24T13:02:00Z"}, 
{"price":1.5,"exchange":50,"Time":"2017-7-24T13:06:00Z"} 
] 

UDF

// udf.getLast 
function main(objs) { 
    if(objs==null||objs==undefined||objs.length==0)return null; 
    return objs[objs.length-1]; 
} 
// udf.getFirst 
function main(objs) { 
    if(objs==null||objs==undefined||objs.length==0)return; 
    return objs[0]; 
} 

QUERY

SELECT 
    DateAdd(minute,-5,System.TIMESTAMP) as WinStartTime, 
    System.TIMESTAMP as WinEndTime, 
    UDF.getFirst(Collect()) AS FIRST, 
    UDF.getLast(Collect()) AS LAST, 
    Max(price) as H, 
    Min(price) as L, 
    Count(*) as EventCount 
FROM [input1] TIMESTAMP By Time 
GROUP BY TumblingWindow(minute, 5) 

ERGEBNIS:

enter image description here

+0

Oh, das ist großartig. Funktioniert perfekt - ich habe es gerade getestet. Große Verwendung von UDF. Akzeptieren Sie diese Antwort! – gleb1783

Verwandte Themen