我有一些输入数据。有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)也会给我一个错误,因为它是一个字符串。
答案 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