Run this query and study the results. If you are still unsure then ask:
SELECT
DateAndTime,
AbsoluteMinutes, -- minutes since 19000101.
AbsoluteMinutes/60.00, -- INT divided by DECIMAL: decimal fraction retained.
AbsoluteMinutes/60, -- INT divided by INT: decimal fraction truncated.
(AbsoluteMinutes/60)*60, -- round down to nearest hour boundary. Brackets for clarity.
RoundedDateAndTime = dateadd(minute,AbsoluteMinutes/60*60,0)
FROM ( -- some sample data
SELECT DateAndTime = GETDATE() UNION ALL
SELECT DateAndTime = DATEADD(minute,10,GETDATE()) UNION ALL
SELECT DateAndTime = DATEADD(minute,20,GETDATE()) UNION ALL
SELECT DateAndTime = DATEADD(minute,30,GETDATE()) UNION ALL
SELECT DateAndTime = DATEADD(minute,40,GETDATE()) UNION ALL
SELECT DateAndTime = DATEADD(minute,50,GETDATE()) UNION ALL
SELECT DateAndTime = DATEADD(minute,60,GETDATE()) UNION ALL
SELECT DateAndTime = DATEADD(minute,70,GETDATE()) UNION ALL
SELECT DateAndTime = DATEADD(minute,80,GETDATE()) UNION ALL
SELECT DateAndTime = DATEADD(minute,90,GETDATE()) UNION ALL
SELECT DateAndTime = DATEADD(minute,100,GETDATE()) UNION ALL
SELECT DateAndTime = DATEADD(minute,110,GETDATE()) UNION ALL
SELECT DateAndTime = DATEADD(minute,120,GETDATE())
) t
CROSS APPLY (SELECT AbsoluteMinutes = datediff(minute,0,DateAndTime)) x
Your query has much scope for improvement. Try this - if the figures are out, it shouldn't take much effort to tweak:
;WITH temp56 AS (
SELECT
DateAndTime,
kwh= SUM(CASE WHEN tagindex = 0 THEN Val ELSE 0 END),
PF= SUM(CASE WHEN tagindex = 1 THEN Val ELSE 0 END),
LLAVG= SUM(CASE WHEN tagindex = 2 THEN Val ELSE 0 END),
LNAVG= SUM(CASE WHEN tagindex = 3 THEN Val ELSE 0 END),
[avg CURRENT]= SUM(CASE WHEN tagindex = 4 THEN Val ELSE 0 END),
frequency= SUM(CASE WHEN tagindex = 5 THEN Val ELSE 0 END)
FROM dbo.FloatTable
WHERE tagindex BETWEEN 0 AND 5
AND dateandtime >= @st
AND dateandtime <= DATEADD(dd,1,@st)
GROUP BY DateAndTime
)
SELECT
DateAndTime = x.DateGroup,
KWH= AVG(kwh),
PF= AVG(PF),
LLAVG= AVG(LLAVG),
LNAVG= AVG(LNAVG),
AVGCURRENT= AVG([AVG CURRENT]),
FREQ= AVG(frequency)
FROM temp56
CROSS APPLY (
SELECT DateGroup = CASE
WHEN @typ IN (15,30,60) THEN DATEADD(MINUTE,DATEDIFF(MINUTE,0,DateAndTime)/@typ*@typ,0)
ELSE DateAndTime END
) x
GROUP BY x.DateGroup
ORDER BY x.DateGroup
For fast, accurate and documented assistance in answering your questions, please read this article.
Understanding and using APPLY, (I) and (II) Paul White
Hidden RBAR: Triangular Joins / The "Numbers" or "Tally" Table: What it is and how it replaces a loop Jeff Moden