微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Azure 流分析 - 您可以查询最近的非空值吗?

如何解决Azure 流分析 - 您可以查询最近的非空值吗?

我有一个 Azure 流分析作业,其中包含来自 IoT 中心的输入数据,我正在将此数据发送到 Power BI。数据正在使用 pub/sub 更新,因此每条消息只更新一个值。出于这个原因,我的输入数据看起来像这样(MessageID 5 是最近的消息):

消息ID 每分钟转数 温度 压力
5 800
4 50
3 4
2 23
1 900

我想在 Power bi 仪表板和实时固定到仪表板的报告上显示最新的非空值。在这个例子中,我想要一张卡片或仪表来显示每个变量的最新非空值,所以

RPM = 800,Temperature = 50,and
Pressure = 4.

认情况下,Power BI 仪表板读取最新值,因此如果该值不是刚刚更新(并且在表中为 null),仪表板会显示 (Blank) 作为值。

是否有 sql 查询要从我的 Azure 流分析作业中写入以获得每个变量的最新非空值?或者其他一些解决方法

谢谢

解决方法

ASA 的优势之一是您可以在 time window 上对事件进行分组:

Illustration of a tumbling window

这里,如果我理解正确的话,当您一次查看事件一时,您只会获得 1 个数据点。解决这个问题的方法是查看一个时间窗口,并将所有数据点投影到单个输出事件中。

假设您应该每 10 秒接收 1 个数据点。然后,您可以编写一个查询,该查询将对该时间窗口上的所有事件进行 GROUP BY,并输出所有 4 个事件的结果:


WITH dataPrep AS (
SELECT
    CAST(GetMetadataPropertyValue(IoTHub,'IoTHub.EnqueuedTime') AS datetime) AS eventDateTime,GetMetadataPropertyValue(IoTHub,'IoTHub.ConnectionDeviceId')  AS DeviceId,*
FROM IoTHub
)

SELECT 
    System.Timestamp() AS DateTime,DeviceId,LAST(RPM) OVER (PARTITION BY DeviceId LIMIT DURATION(second,20) WHEN RPM IS NOT NULL),LAST(FuelRate) OVER (PARTITION BY DeviceId LIMIT DURATION(second,20) WHEN FuelRate IS NOT NULL),LAST(DischargePressure) OVER (PARTITION BY DeviceId LIMIT DURATION(second,20) WHEN DischargePressureIS NOT NULL),LAST(SystemPressure) OVER (PARTITION BY DeviceId LIMIT DURATION(second,20) WHEN SystemPressure IS NOT NULL)   

INTO
    powerbioutput
FROM
    dataPrep TIMESTAMP BY eventDateTime
GROUP BY
    DeviceId,TumblingWindow(second,10)
WHERE
    DeviceId = 'rpi1'

这里我使用了 LAST,语法可能看起来有点复杂但很简单。因为它需要 PARTITION BY,所以我必须明确说明,如果你想在未来扩展,这是一个很好的做法。

根据您的要求,您可以使用 MAX、MIN 或 AVG 使其更简单。

你可以看here for other ASA query patterns

,

在这种情况下,您可以使用 Coalesce。它按顺序计算参数并返回最初不计算为 NULL 的第一个表达式的值。

参考以下链接-

https://docs.microsoft.com/en-us/stream-analytics-query/coalesce-azure-stream-analytics

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。