使用流分析从单个 select 输出多条记录
Output multiple records from single select with Stream Analytics
是否可以从流分析中的单个 select 动态输出多个记录?
例如,我收到以下格式的事件:
{
"value": 600,
"duration": 300
}
持续时间以秒为单位
如何每秒输出一条记录,其中包含持续时间的平均值?像下面这样的东西,只有 300 次?
SELECT
value / duration AS value
1 AS duration
FROM Input
我认为返回数组记录也很好,因为可以使用 CROSS APPLY GetArrayElements
将其转换为单独的事件
这在当今的流分析查询语言中无法直接实现 - 请继续关注即将推出的可扩展性改进。
您可以使用 HoppingWindow 生成常规事件(例如每秒一次),然后加入您的流以每秒生成一次事件,条件是它们在传入事件之前不超过 [duration] 秒。
像这样:
WITH
InputWithTimestamp AS
(
SELECT
System.Timestamp as timestamp, [value], [duration]
FROM input
),
RegularEvents AS
(
SELECT
System.Timestamp as timestamp,
count()
FROM InputWithTimestamp
GROUP BY HoppingWindow(second, 1000, 1) -- assuming at least one event arrives evry 1000 seconds
)
SELECT
RegularEvents.timestamp,
InputWithTimestamp.value/InputWithTimestamp.[duration] as [value]
FROM
RegularEvents
JOIN
InputWithTimestamp
ON DATEDIFF(second, RegularEvents, InputWithTimestamp) BETWEEN 0 AND 1000 -- assuming 1000 is max possible duration
AND DATEDIFF(second, RegularEvents.timestamp, InputWithTimestamp.timestamp) BETWEEN 0 AND InputWithTimestamp.[duration]
是否可以从流分析中的单个 select 动态输出多个记录?
例如,我收到以下格式的事件:
{
"value": 600,
"duration": 300
}
持续时间以秒为单位
如何每秒输出一条记录,其中包含持续时间的平均值?像下面这样的东西,只有 300 次?
SELECT
value / duration AS value
1 AS duration
FROM Input
我认为返回数组记录也很好,因为可以使用 CROSS APPLY GetArrayElements
这在当今的流分析查询语言中无法直接实现 - 请继续关注即将推出的可扩展性改进。
您可以使用 HoppingWindow 生成常规事件(例如每秒一次),然后加入您的流以每秒生成一次事件,条件是它们在传入事件之前不超过 [duration] 秒。
像这样:
WITH
InputWithTimestamp AS
(
SELECT
System.Timestamp as timestamp, [value], [duration]
FROM input
),
RegularEvents AS
(
SELECT
System.Timestamp as timestamp,
count()
FROM InputWithTimestamp
GROUP BY HoppingWindow(second, 1000, 1) -- assuming at least one event arrives evry 1000 seconds
)
SELECT
RegularEvents.timestamp,
InputWithTimestamp.value/InputWithTimestamp.[duration] as [value]
FROM
RegularEvents
JOIN
InputWithTimestamp
ON DATEDIFF(second, RegularEvents, InputWithTimestamp) BETWEEN 0 AND 1000 -- assuming 1000 is max possible duration
AND DATEDIFF(second, RegularEvents.timestamp, InputWithTimestamp.timestamp) BETWEEN 0 AND InputWithTimestamp.[duration]