2017-06-05 86 views
0

我有一個消息數組;在每條消息內是另一個開始/停止值的數組。我可以很好地獲取消息數組,但在Azure中執行流分析查詢時,獲取嵌套開始/停止值的下一級別返回0條記錄。流分析 - 查詢嵌套數組返回0結果

以下是Stream Analytics查詢。

WITH 
main AS 
(
    SELECT   message.ArrayValue.header.messageId, 
        message.ArrayValue.startStopBlock as SSBlock      

    FROM   IoTHub i 
    CROSS APPLY  GetArrayElements(i.[STARTSTOPTIME:topic].message) AS 
message 
) 

SELECT    m.messageId,    
        SSEntry.ArrayValue.start, 
        SSEntry.ArrayValue.stop 

FROM   main m 
CROSS APPLY  GetArrayElements(m.SSBLOCK.ArrayValue.startStop) AS SSEntry 

這裏是JSON

{ 
 
\t "@xsi:schemaLocation" : "", 
 
\t "nextBuffer" : { 
 
\t \t "url" : "", 
 
\t \t "moreData" : "false" 
 
\t }, 
 
\t "message" : [{ 
 
\t \t \t "header" : { 
 
\t \t \t \t "messageId" : "951262328", 
 
\t \t \t }, 
 
\t \t \t "totalStartStops" : "2", 
 
\t \t \t "startStopBlock" : { 
 
\t \t \t \t "startStop" : [{ 
 
\t \t \t \t \t \t "start" : "2017-05-16 14:11:01", 
 
\t \t \t \t \t \t "stop" : "2017-05-16 14:14:16", 
 
\t \t \t \t \t \t "operatorId" : "0" 
 
\t \t \t \t \t }, { 
 
\t \t \t \t \t \t "start" : "2017-05-16 14:38:45", 
 
\t \t \t \t \t \t "stop" : "2017-05-16 14:44:19", 
 
\t \t \t \t \t \t "operatorId" : "0" 
 
\t \t \t \t \t } 
 
\t \t \t \t ] 
 
\t \t \t } 
 
\t \t }, { 
 
\t \t \t "header" : { 
 
\t \t \t \t "messageId" : "951266462", 
 
\t \t \t }, 
 
\t \t \t "totalStartStops" : "2", 
 
\t \t \t "startStopBlock" : { 
 
\t \t \t \t "startStop" : [{ 
 
\t \t \t \t \t \t "start" : "2017-05-16 14:08:09", 
 
\t \t \t \t \t \t "stop" : "2017-05-16 14:08:20", 
 
\t \t \t \t \t \t "operatorId" : "-1" 
 
\t \t \t \t \t }, { 
 
\t \t \t \t \t \t "start" : "2017-05-16 14:54:38", 
 
\t \t \t \t \t \t "stop" : "2017-05-16 15:01:17", 
 
\t \t \t \t \t \t "operatorId" : "-1" 
 
\t \t \t \t \t } 
 
\t \t \t \t ] 
 
\t \t \t } 
 
\t \t } 
 
\t ] 
 
}

回答

0

按我的理解,你可以嘗試通過改變message.ArrayValue.startStopBlock as SSBlockmessage.ArrayValue.startStopBlock.startStop as SSBlock來檢索第一個查詢的嵌套數組。這裏是我的測試,你可以參考一下吧:

查詢

WITH main AS 
(
    SELECT 
     message.ArrayValue.header.messageId, 
     message.ArrayValue.startStopBlock.startStop as SSBlock      
    FROM IoTHub i 
    CROSS APPLY GetArrayElements(i.message) AS message 
) 

SELECT 
    m.messageId,    
    SSEntry.ArrayValue.start, 
    SSEntry.ArrayValue.stop 
FROM main m 
CROSS APPLY GetArrayElements(m.SSBLOCK) AS SSEntry 

結果 enter image description here

+0

不錯的工作,正是我需要的! –