я имею следующую хранимую процедуру:вычисляемого столбца SQL в хранимой процедуре
SELECT
a.OtherMeasurementID
, a.MeasurementID
, b.MeasurementCode
, a.OperationDate
, a.OperationTime
, a.AccumulatedMass
, CAST(a.OperationDate AS datetime) + CAST(a.OperationTime as datetime) oDateTime
INTO
#_OtherMeasurement
FROM
_OtherMeasurement a
INNER JOIN
_Measurement b ON a.MeasurementID = b.MeasurementID
WHERE
a.OperationDate >= DATEADD(DAY, -1, @StartDate)
AND a.OperationDate <= DATEADD(DAY, 1, @EndDate)
AND b.MeasurementCode LIKE '%Inlet%'
--============================================
;with CTE as
(
select
T1.OtherMeasurementID
, t1.MeasurementID
, T1.MeasurementCode
, T1.OperationDate
, T1.OperationTime
, T1.AccumulatedMass
, case when T1.AccumulatedMass = 0 then 0 else T1.AccumulatedMass - T2.AccumulatedMass end as ReceivedMass
, T1.oDateTime
From
#_OtherMeasurement T1
left join
#_OtherMeasurement T2 on T1.MeasurementCode = T2.MeasurementCode
and DATEADD(Hour, -1, T1.oDateTime) = T2.oDateTime
left join
#_OtherMeasurement T3 on T1.MeasurementCode = T3.MeasurementCode
and DATEADD(Hour, 1, T1.oDateTime)= T3.oDateTime
)
,CTE2 as
(
select
T1.OtherMeasurementID
, T1.MeasurementID
, T1.MeasurementCode
, T1.OperationDate
, T1.OperationTime
, T1.AccumulatedMass
, case when T1.AccumulatedMass = 0 then (T2.ReceivedMass + T3.ReceivedMass)/2 else T1.ReceivedMass end as ReceivedMass
From
CTE T1
left join
CTE T2 on T1.OperationDate = T2.OperationDate and T1.MeasurementCode = T2.MeasurementCode
and DATEADD(Hour, -1, T1.oDateTime)= T2.oDateTime
left join
CTE T3 on T1.OperationDate = T3.OperationDate and T1.MeasurementCode = T3.MeasurementCode
and DATEADD(Hour, 1, T1.oDateTime)= T3.oDateTime
)
select
OtherMeasurementID,
MeasurementID,
MeasurementCode,
OperationDate,
OperationTime,
AccumulatedMass,
coalesce(ReceivedMass, 0) ReceivedMass
from
CTE2
WHERE
OperationDate BETWEEN @StartDate AND @EndDate
, если вы видите на CTE2, есть линия
case when T1.AccumulatedMass = 0 then (T2.ReceivedMass + T3.ReceivedMass)/2 else T1.ReceivedMass end as ReceivedMass
Эта линия будет работать, если нулевое значение накопленного массы в тот же день. Данные для таблицы являются почасовыми. Если нулевое значение 10/января/2015 23:00:00, то линия не будет работать. потому что следующее значение должно быть на 11 января/2015 00:00:00. sample statement, если значение до и после нуля находится в ту же дату, расчет будет работать. Если нет, то работать не будет.
Мой вопрос в том, как я могу заставить формулу работать даже следующее значение после нуля на другую дату ..?
Пример:
OtherMeasurementID MeasurementID MeasurementCode OperationDate OperationTime AccumulatedMass ReceivedMass
17 1 Water Inlet 13-Oct-2014 17:00:00 236265.36 518.58
18 1 Water Inlet 13-Oct-2014 18:00:00 236795.95 530.59
19 1 Water Inlet 13-Oct-2014 19:00:00 0 533.57
20 1 Water Inlet 13-Oct-2014 20:00:00 237865.13 536.55
21 1 Water Inlet 13-Oct-2014 21:00:00 238404.14 539.01
22 1 Water Inlet 13-Oct-2014 22:00:00 238944.05 539.91
23 1 Water Inlet 13-Oct-2014 23:00:00 0 0
24 1 Water Inlet 14-Oct-2014 0:00:00 240026 240026
25 1 Water Inlet 14-Oct-2014 1:00:00 240566.98 540.98
26 1 Water Inlet 14-Oct-2014 2:00:00 241107.92 540.94
Если вы можете видеть на приведенном выше примере. в 13/Oct/2015 19:00, накопленная масса равна нулю. поэтому формула для расчета принимаемой массы равна (previous receivedmass before zero + next receivedmass after zero)/2
Но, если вы видите 13/Oct/2015 23:00, приведенная выше формула не работает, потому что next receivedmass after zero
находится на другой дате, которая равна 14/окт/2015 00:00.
спасибо.
Вы можете попытаться упростить запрос вниз только то, что имеет дело с проблемой под рукой (то есть я бы ожидать ' CTE' в настоящее время может быть заменен табличной переменной) с некоторыми примерными данными и ожидаемыми результатами. На данный момент есть много запросов, чтобы мы могли понять, и мы: а) не имеем доступа к вашей базе данных и б) не знаем, чего вы пытаетесь достичь. –
@Damien_The_Unbeliever, добавлено. – Haminteu
Вы присоединяетесь к 'T1.OperationDate = T3.OperationDate', таким образом, вы ограничиваете его в тот же день. Что произойдет, если вы удалите эту часть из 'join'? (и удалите 'T1.OperationDate = T2.OperationDate', а также - ту же проблему, если' accumulatedmass' был равен нулю в '00: 00') –