2017-07-21 1 views
0

J'essaie de calculer les valeurs Open, Low, High et Close pour les cours boursiers à l'aide d'Azure Stream Analytics SQL.Azure Streaming Analytics Calculer OHLC

Je peux obtenir Min et Max assez facilement, mais j'ai du mal à calculer comment calculer Open (FIRST) et Close (LAST) d'une TumblingWindow.

J'ai trouvé la documentation ici (https://docs.microsoft.com/en-us/azure/stream-analytics/stream-analytics-stream-analytics-query-patterns) pour faire le premier et le dernier mais je ne peux pas les combiner en une seule requête.

Voici ce que j'ai:

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 

Je ne suis pas très avancé dans SQL, mais est-il un moyen de combiner en une seule requête? Même avec l'utilisation de sous-requêtes.

Remarque: 5 secondes est juste un exemple de fenêtre que j'ai choisi pour les tests.

Répondre

0

Selon votre scénario, j'ai supposé que vous pouviez tirer parti de la fonction d'agrégat Collect et user-defined functions d'Azure Stream Analytics pour atteindre votre objectif. Voici les détails, vous pouvez vous y reporter:

En supposant que votre entrée se présente comme suit:

[ 
{"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) 

RÉSULTAT:

enter image description here

+0

Oh, qui est grand. Fonctionne parfaitement - Je viens de le tester. Grande utilisation de UDF. Accepter cette réponse! – gleb1783