Причина, по которой столбец GT2HP
, указанный в AVG(GT2HP)
, всегда равен нулю, связана с семантикой SQL.
Столбцы в предложении SELECT могут ссылаться только на источники, на которые ссылается FROM, и, поскольку IotHubInput.GT2HP
нет - это интерпретируется как ноль.
Если вы разделите свой запрос на несколько этапов, как предположил Виньеш, в итоге вы получите первый шаг, вычисляющий COLLECT
в течение 60-секундного окна:
SELECT Collect() AS c
WHERE IoTHub.ConnectionDeviceId = 'uk-iotedge'
FROM IotHubInput
GROUP BY TumblingWindow(second, 60)
Давайте назовем это step1
. Теперь, поскольку вы группируете только по окну, вы будете иметь только одно значение столбца c
каждые 60 секунд.
Любая агрегация по этому не требуется, если вы не увеличите размер окна, чтобы агрегировать более одного значения ...
Так что AVG в AVG (GT2HP) не нужен.
Второй шаг тогда будет:
SELECT
c,
GT2HP = UDF.GT2HP(c)
FROM step1
Давайте назовем этот шаг step2
.
Теперь окончательный выбор будет:
SELECT
GT2HP,
UDF.LPLPReturns(c) as LPLPReturns,
UDF.LPGasHeater(c) as LPGasHeater,
UDF.HPRaisedSW(c, GT2HP) as HPRaisedSW,
UDF.HPCustomerDemand(c, GT2HP) as HPCustomerDemand
INTO SQLDWUKSTEAMLOSS
FROM step2
И все это вместе:
WITH step1 AS (
SELECT Collect() AS c
WHERE IoTHub.ConnectionDeviceId = 'uk-iotedge'
FROM IotHubInput
GROUP BY TumblingWindow(second, 60)
),
step2 AS (
SELECT
c,
GT2HP = UDF.GT2HP(c)
FROM step1
)
SELECT
GT2HP,
UDF.LPLPReturns(c) as LPLPReturns,
UDF.LPGasHeater(c) as LPGasHeater,
UDF.HPRaisedSW(c, GT2HP) as HPRaisedSW,
UDF.HPCustomerDemand(c, GT2HP) as HPCustomerDemand
INTO SQLDWUKSTEAMLOSS
FROM step2