我有一些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)是如何工作的,但如果我将其删除,则会出现错误。任何帮助将不胜感激。
答案 0 :(得分:1)
请在下面找到一些答案。如果您有任何进一步的问题,请与我们联系。
为什么您的查询不会返回此示例的数据:
我查看了数据和查询,以下语句暗示您对值“Time”具有严格的相等性:I1.Time = I2.Time。但是在您的示例中,2个条目的时间不同,因此没有结果。
DATEDIFF语句不会放宽JOIN语句中的任何相等要求。
通过删除“I1.Time = I2.Time and”行,您将看到样本的结果。在这种情况下,它将加入一分钟内到达的记录。请注意,如果您在同一分钟内有多个记录到达,您将看到使用此逻辑的多个连接结果。您还可以使用应用程序时间戳来比较数据中的时间戳,而不是消息的到达时间。
有关DATEDIFF的更多信息:
Azure流分析中的JOIN本质上是暂时的,这意味着每个JOIN必须对匹配行在多长时间内分开的距离提供一些限制。 在您的情况下,由于没有明确的TIMESTAMP,将使用到达时间。
然后,将应用JOIN条件,并且在您的示例中没有与条件匹配的数据。