我正在尝试提取每分钟生成的零件,其中v是生产零件的聚合计数器,直到那时为止。
我的天蓝色SQL查询如下
select
x.fqn,
( max(cast(y.arrayvalue.v as BIGINT))-(min(cast(y.arrayvalue.v as BIGINT)))) as ppm
from
(SELECT
TS.ArrayIndex,
TS.ArrayValue.FQN,
TS.ArrayValue.vqts
FROM
[EventHubInput] as hub
timestamp by y.arrayvalue.t
CROSS APPLY GetArrayElements(hub.timeseries) AS TS) as x
cross apply GetArrayElements(x.vqts) AS y
where x.fqn like '%Production%' and y.arrayvalue.q=192
group by tumblingwindow(minute,1),x.fqn
我的输入数据如下所示
{
"timeSeries": [
{
"fqn":"MyEnterprise.Gateways.GatewayE.CLX.Tags.StateBasic",
"vqts":[
{
"v": "" ,
"q": 192 ,
"t":"2016-06-24T16:39:45.683+0000"
}
]
}, {
"fqn":"MyEnterprise.Gateways.GatewayE.CLX.Tags.ProductionCount",
"vqts":[
{
"v": 264 ,
"q": 192 ,
"t":"2016-06-24T16:39:45.683+0000"
}
]
}, {
"fqn":".Gateways.GatewayE.CLX.Tags.StateDetailed",
"vqts":[
{
"v": "" ,
"q": 192 ,
"t":"2016-06-24T16:39:45.683+0000"
}
]
} ]
我的查询没有返回任何结果。当我通过y.arrayvalue.t删除时间戳时 并在group by子句中添加y.arrayvalue.t,得到一些结果。我意识到这可能是因为我为每个事件都有超过1个时间戳字段,所以我想知道是否有可能将第一个数组的时间数据分配给时间戳...类似于时间戳y [0] .T
答案 0 :(得分:4)
截至今天,Azure Stream Analytics不支持超过数组内部值的时间戳。所以问题的答案是"如果可以将第一个数组的时间数据分配给时间戳"是的。
以下是您可以使用的解决方法:
首先,在一个作业中展平输入消息并输出到分段事件中心:
WITH flattenTS AS
(
SELECT
TS.ArrayIndex,
TS.ArrayValue.FQN,
TS.ArrayValue.vqts
FROM [EventHubInput]
CROSS APPLY GetArrayElements(hub.timeseries) AS TS
)
, flattenVQTS AS
(
SELECT
ArrayIndex
,FQN
,vqts.ArrayValue.v as v
,vqts.ArrayValue.q as q
,vqts.ArrayValue.t as t
FROM flattenTS TS
CROSS APPLY GetArrayElements(TS.vqts) AS vqts
)
SELECT *
INTO [staging_eventhub]
FROM flattenVQTS
然后,使用另一个作业来读取展平的消息并执行窗口聚合:
SELECT
FQN
,MAX(CAST(v as BIGINT))-MIN(CAST(v as BIGINT)) as ppm
FROM [staging_eventhub] timestamp by t
WHERE fqn LIKE '%Production%' and q=192
GROUP BY tumblingwindow(minute,1), fqn
您可能想知道我们是否可以将上述两个作业组合为单个作业中的多个步骤,并避免使用暂存事件中心。不幸的是,你不能使用" timestamp by"今天从CTE或子查询中选择时。