在Azure流分析查询中,在CASE语句中给出错误

时间:2016-07-18 14:48:17

标签: azure-stream-analytics

我有一些输入数据。有3列,fqn,v和t。列v可以具有字符串值或数字。如果fqn类似于%production%那么v将是一个数字,否则它是一个字符串。所以我会有像

这样的数据
FQN,V,T
productioncount,23,time 
state,RUN,time 
productioncount,45,time etc

所以我在流分析查询中有一个case子句,但它看起来像其他fqn(它们的v值如RUN等)也正在处理中。我收到以下错误

"Cannot cast value 'RUN' to type 'bigint' in expression 'cast ( v as BIGINT )'.."

我的查询如下

SELECT
 CASE
WHEN fqn like '%Production%' THEN ( max(cast(v as BIGINT))-(min(cast(v as BIGINT)))) 
ELSE MAX(V)
END AS V,
fqn,min(t) as timeslot
INTO
[finalalloutput]
FROM
[finalallinput] timestamp by t
group by TumblingWindow(minute, 1),fqn

我也想改变

ELSE MAX(V)

反映TOP值。也许Max(V)也会给我一个错误,因为它是一个字符串。

1 个答案:

答案 0 :(得分:1)

您需要在聚合函数参数上应用CASE WHEN ... END逻辑,而不是在聚合函数结果上。否则,将对所有值计算max,并导致引用的错误。

另一个问题是Stream Analytics不支持字符串值的最大聚合函数。将MAX应用于字符串值时,您的期望是什么?你想在你的场景中计算什么?

这是一个为"生产"计算相同结果的查询。值作为您的查询并返回窗口中的最后一个非生产事件:

WITH Step1 AS
(
    SELECT *, CASE WHEN fqn LIKE '%Production%' THEN 1 ELSE 0 END AS IsProduction
    FROM [finalallinput] TIMESTAMP BY t
),
Step2 AS
(
SELECT 
    MAX (CASE WHEN isProduction = 1 THEN cast(v AS BIGINT) ELSE NULL END) - MIN(CASE WHEN IsProduction = 1 THEN cast(v AS BIGINT) ELSE NULL END)   AS ProductionV,    
    TopOne() OVER (ORDER BY IsProduction ASC, t DESC) lastNonProductionEvent
    ,fqn
    ,min(t) AS timeslot
FROM Step1
GROUP BY 
    TumblingWindow(minute, 1)
    ,fqn
)

SELECT 
    fqn, timeslot, ProductionV, lastNonProductionEvent.v NonProductionV
INTO [finalalloutput]
FROM Step2