在StreamAnalytic中查询如何从同一输入连接数据

时间:2018-05-17 18:22:47

标签: azure-stream-analytics

我有一些json数据(InputFuelCon)由流分析查询处理。我想加入自己的输入..当我在输入中查看一个值时,我需要在同一个输入中查看另一个值。我可以这样做吗? json的格式类似于

[{"timeseries":[{"fqn":"STATUS.EngineFuelConsumption","vqts":[{"v":10,"q":192,"t":"2018-05-10T12:34:34.000Z"}]},
{"fqn":"STATUS.ShaftsRunning","vqts":[{"v":"1","q":192,"t":"2018-05-10T12:35:34.000Z"}]}]}]

运行以下内容会产生行,但值为0

WITH DataInput1 AS 
(
SELECT
    DATA.Fqn AS fqn,
    DATA.Value AS value,
    DATA.time AS time
    FROM 
(
    SELECT
        Tag.ArrayValue.Fqn AS fqn,
        VQT.ArrayValue.V AS value,
        VQT.ArrayValue.T AS time
    FROM MetsoQuakeFuelCon AS TimeSeries
    CROSS APPLY GetArrayElements(TimeSeries.[timeSeries]) AS Tag
    CROSS APPLY GetArrayElements(Tag.ArrayValue.vqts) AS VQT
) AS DATA
WHERE DATA.fqn like  '%EngineFuelConsumption'

),
DataInput2 AS 
(
SELECT
    DATA.Fqn AS fqn,
    DATA.Value AS value,
    DATA.time AS time
    FROM 
(
    SELECT
        Tag.ArrayValue.Fqn AS fqn,
        VQT.ArrayValue.V AS value,
        VQT.ArrayValue.T AS time
    FROM MetsoQuakeFuelCon AS TimeSeries
    CROSS APPLY GetArrayElements(TimeSeries.[timeSeries]) AS Tag
    CROSS APPLY GetArrayElements(Tag.ArrayValue.vqts) AS VQT
) AS DATA
WHERE DATA.fqn like  '%ShaftsRunning' and DATA.Value like '1'

),
DataInput as (
select I1.Fqn AS fqn,
      cast(I1.Value as bigint)/30 AS value,
     DATETIMEFROMPARTS(DATEPART(year,I1.Time ),DATEPART(month,I1.Time ),DATEPART(day,I1.Time )
    ,DATEPART(hour,I1.Time ),00,00,00 ) AS time
       from DataInput1 I1 JOIN DataInput2 I2 
ON 
I1.Time=I2.Time and
DATEDIFF(MINUTE,I1,I2) BETWEEN 0 AND 1
)

select * from DataInput

DataInput1和DataInput2如果自己运行,每个给出一条记录并具有sql经验,时间戳上的datainput连接应该给出结果,但事实并非如此。我不明白0和1之间的DATEDIFF(MINUTE,I1,I2)是如何工作的,但如果我将其删除,则会出现错误。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

请在下面找到一些答案。如果您有任何进一步的问题,请与我们联系。

为什么您的查询不会返回此示例的数据:

我查看了数据和查询,以下语句暗示您对值“Time”具有严格的相等性:I1.Time = I2.Time。但是在您的示例中,2个条目的时间不同,因此没有结果。

DATEDIFF语句不会放宽JOIN语句中的任何相等要求。

通过删除“I1.Time = I2.Time and”行,您将看到样本的结果。在这种情况下,它将加入一分钟内到达的记录。请注意,如果您在同一分钟内有多个记录到达,您将看到使用此逻辑的多个连接结果。您还可以使用应用程序时间戳来比较数据中的时间戳,而不是消息的到达时间。

有关DATEDIFF的更多信息:

Azure流分析中的JOIN本质上是暂时的,这意味着每个JOIN必须对匹配行在多长时间内分开的距离提供一些限制。 在您的情况下,由于没有明确的TIMESTAMP,将使用到达时间。

然后,将应用JOIN条件,并且在您的示例中没有与条件匹配的数据。