SELECT b.[timestamp], b.[id], b.[Date], b.[HourMin], b.[Min], b.[Last]
FROM [vw_BassLineDataTimestamp] b
;WITH CTE AS
(
SELECT MIN([timestamp]) [timestamp], MIN(id) id, [date],LEFT(CAST(MIN(dt) AS TIME),5) HourMin,MIN([Min]) [Min] FROM
(
SELECT * , CASE WHEN
(
DATEDIFF(HOUR, CAST([date] as datetime),dt) < 4
OR
(DATEDIFF(HOUR, CAST([date] as datetime),dt) >= 12 AND DATEDIFF(HOUR, CAST([date] as datetime),dt) < 16)
)
THEN 1
WHEN
(
(DATEDIFF(HOUR, CAST([date] as datetime),dt) >= 4 AND DATEDIFF(HOUR, CAST([date] as datetime),dt) < 8)
OR
(DATEDIFF(HOUR, CAST([date] as datetime),dt) >= 16 AND DATEDIFF(HOUR, CAST([date] as datetime),dt) < 20)
)
THEN 2
WHEN
(
DATEDIFF(HOUR, CAST([date] as datetime),dt) >=8 AND DATEDIFF(HOUR, CAST([date] as datetime),dt) < 12
OR
DATEDIFF(HOUR, CAST([date] as datetime),dt) >=20 AND DATEDIFF(HOUR, CAST([date] as datetime),dt) < 24
)
THEN 3
END grp
FROM
(
SELECT [timestamp], id , [Date] , HourMin,[Min],[last]
, DATEADD(day, DATEDIFF(day, 0, [Date]), HourMin + ':00') dt
FROM
[dbo].[LTC1minData]
)k
)i
WHERE [date] = '2017-11-20'
GROUP BY [date],grp
)
SELECT c.*,l.Last FROM CTE c
INNER JOIN [dbo].[LTC1minData] l
ON l.Date = c.Date AND l.timestamp = c.timestamp AND l.id = c.id
/*------------------------
OUTPUT
------------------------*/
timestamp id date HourMin Min Last
----------------------------- --------------------------- -------------- ------- ---- ------------
2017-11-20T08:00:48.467 BTC-LTC_2017-11-20_08:00 2017-11-20 08:00 0 0.00890995
2017-11-20T04:00:50.583 BTC-LTC_2017-11-20_04:00 2017-11-20 04:00 0 0.009015
2017-11-20T00:00:51.573 BTC-LTC_2017-11-20_00:00 2017-11-20 00:00 0 0.0089
(3 row(s) affected)
Notice: MSSQL keeps results in the same data type, so dividing an int by another int does not result in a float, this doesn't need Round(DateDiff(minute,0, somedatetime)/intervalleng
Now it's a bit unclear what you want, do you want the value of [Last] as it is in the last record of the group? Then you need to look for the record with the max(somedatetime) within that group (that's received by grouping) and pick out the full record of that somedateetime=maxsomedatet
That could be done with window function and partitioning using LAST_VALUE ( [Last]) OVER ( partition by DateDiff(minute,0, somedatetime)/intervalleng
Bye, Olaf.