在流分析查询中如何在将数据发送到 UDA 函数之前根据列对数据进行排序

In stream analytics query how to order the data based on column before sending it to a UDA function

所以我有一个 Azure 流分析查询。它加入了 2 个输入,并且需要成为用户定义的聚合函数的输入。在 UDA 函数中,我需要对传入的行进行一些字符串连接并输出一个最终字符串。因此,连接中的顺序或行对于作为字符串的列之一的顺序很重要。 SA 工作不允许我订购,所以我该如何完成。以下是查询的代码摘录..

CalcData AS
(
SELECT 
  x.fqn AS fqn,       
  x.value as xvalue,
  y.value as yvalue,
  x.time as time
FROM (select fqn
,value, time from DataInput1 ) y
join
(SELECT
fqn as fqn,
 value as value,
  time as time
FROM DataInput2 ) x on y.time=x.time and x.fqn=y.fqn and DATEDIFF(second, x, y) = 0
--order by time asc, fqn 
),
FormatData AS
(
SELECT UDA.svgstring(CalcData) AS v,
time    FROM CalcData
GROUP BY time,TumblingWindow(minute, 1)
)

我需要按 fqn 列排序,但出现错误

Syntax errors: The ORDER BY clause is not valid in views, inline functions, derived tables, sub-queries, and common table expressions, unless TOP or FOR XML or OFFSET is also specified.

任何帮助将不胜感激。

编辑:我也试过了

我试过了

CalcData AS
 (
SELECT TOP 10000
x.fqn AS fqn,       
x.value as xvalue,
y.value as yvalue,
x.time as time
FROM (select fqn
,value, time from DataInput1 ) y
join
(SELECT
fqn as fqn,
value as value,
time as time
FROM DataInput2 ) x on y.time=x.time and x.fqn=y.fqn and DATEDIFF (second,   x, y) = 0
order by time, fqn 
),
FormatData AS
(
SELECT UDA.svgstring(CalcData) AS v,
time    FROM CalcData
 GROUP BY time,TumblingWindow(minute, 1)
)

但是订单似乎没有生效

Stream Analytics 目前没有 order by 子句。在您的原始查询顺序是 group by window 之前,因为 ASA 正在处理无界流,为了能够按非时间戳列排序,您必须将事件分组到 windows 首先。在 window 中,您可以订购所有活动。

我看到您有 time, fqn 按列排序。假设time是payload的时间戳,可以使用select ... from input timestamp by time.

实现按应用时间排序

然后您可以在 UDA.svgstring 中进行更多级别的排序。函数的输入不会按 fqn 排序,而是按 time 排序。您将必须累积所有事件,当调用 computeResult() 时,按 fqn 排序并在有序行上创建字符串。