Я переписал ваш запрос в CTE, чтобы снова использовать подзапрос.пожалуйста, проверьте следующее: - поэтому я добавил еще один вывод в ваш запрос под названием TheTimeOfMaxDM.Надеюсь, это то, что вам нужно.
;with LastMonthData as (
--get the data for the last month, and sum value if same time stamp is recorded (this is not logical)
select [theDate], [theTime], [Value], sum([Value]) as windowAvg
from [tOne]
Where ([theDate] > convert(Date,DATEADD(month, -1, '2019-05-3')))--changed this to match the data provided.
group by theDate, theTime, Value
),
RunningAvg15Min as (
select [theDate], [theTime], [Value],
avg(windowAvg) over(order by theDate DESC, theTime rows between 90 preceding and current row) as rolling_avg,
datepart(hh,theTime) as timeHour
from LastMonthData
),DataSetGrouping as (
select
min([theDate]) as theDate,
min([theTime]) as theTime,
min(datepart(hh,theTime)) as timeHour,
max([Value]) as maxValue,
max([rolling_avg]) as maxDM
from RunningAvg15Min
GROUP BY
DATEPART(YEAR, TheDate),
DATEPART(MONTH, TheDate),
DATEPART(DAY, TheDate),
DATEPART(HOUR, TheTime),
(DATEPART(MINUTE, TheTime) / 60) ---change the 60 to 15, to change the grouping from per hour to per 15min
)
select * ,
(select top(1) r.[theTime] from RunningAvg15Min r where
r.[theDate]=theDate
and r.[theTime]>=theTime
and r.rolling_avg=maxDM
order by r.[theDate],r.[theTime]
) [TheTimeOfMaxDM]
from DataSetGrouping
ORDER BY thedate DESC, thetime DESC
Еще одно замечание, я не знаю, нужно ли вам это или нет, но если вы хотите сгруппировать по 15 минут, вы можете использовать ниже в разделе группировки
GROUP BY
DATEPART(YEAR, TheDate),
DATEPART(MONTH, TheDate),
DATEPART(DAY, TheDate),
DATEPART(HOUR, TheTime),
(DATEPART(MINUTE, TheTime) / 15)
Я попытаюсь проверить точку, возьмем, к примеру, следующую строку вывода: -
theDate theTime Value rolling_avg timeHour
2019-04-07 17:20:49.0000000 398.3 314.499999999997 17
В 2019-04-07 между 17 и 18 часами максимальное значение roll_avg равно314.499999999997, и время для этого максимума было 17: 20: 49.0000000, мы можем видеть, что мы заменили последнюю часть cte следующим: -
select * from RunningAvg15Min where rolling_avg between 314 and 315
and thedate='2019-04-07' and theTime between '17:00:00' and '18:00:00'
output
theDate theTime Value rolling_avg timeHour
2019-04-07 17:20:49.0000000 398.3 314.499999999997 17
Подводя итог моему ответу, вы можете использовать CTE в моде из запроса, который я написал, чтобы упростить подзапросы и ссылаться на них более одного раза в вашем запросе, если это необходимо.надеюсь, это поможет.