В StreamAnalytic Query, как объединить данные из одного входа - PullRequest
0 голосов
/ 17 мая 2018

У меня есть некоторые данные 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 соединение данных включается в отметку временидолжен дать результат, но это не так.Я не понимаю, как работает DATEDIFF (MINUTE, I1, I2) МЕЖДУ 0 И 1, но если я удаляю его, возникает ошибка.Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 22 мая 2018

пожалуйста, найдите несколько ответов ниже. Дайте мне знать, если у вас есть еще вопросы.

Почему ваш запрос не возвращает данные в этом примере:

Я посмотрел на данные и запрос, и следующее утверждение подразумевает, что у вас есть строгое равенство со значением «Время»: I1.Time = I2.Time. Однако в вашем примере время для двух записей разное, поэтому результата нет.

Оператор DATEDIFF не ослабляет требования равенства в операторе JOIN.

Удалив строку «I1.Time = I2.Time and», вы увидите результат для вашего образца. В этом случае он присоединится к записям, поступающим в течение минуты. Обратите внимание, что если в одну и ту же минуту поступило более 1 записи, вы увидите более 1 объединенного результата с этой логикой. Также вы можете использовать временную метку приложения для сравнения временной отметки в данных, а не времени прибытия сообщения.

Больше информации о DATEDIFF:

JOIN в Azure Stream Analytics носит временный характер, что означает, что каждое JOIN должно обеспечивать некоторые ограничения на то, как далеко соответствующие строки могут быть разделены во времени. В вашем случае, поскольку нет явного TIMESTAMP, будет использовано время прибытия.

Затем будет применено условие JOIN, и в вашем примере нет данных, соответствующих условию.

...