Ниже я решил сформировать цикл из 4 смен, используя 2 оператора перекрестного применения, чтобы псевдонимы столбцов можно было использовать повторно, что, надеюсь, облегчит их чтение.
Использование datediff (hour, ...) и модуль от начальной точки 2018-01-01 07:00 мы можем выяснить, какие часы находятся в первой или второй смене, а затем второй расчет модуля говорит нам, какой из 2 дней имеет значение, вместе мы можем тогдасделать 4 сменных цикла, которые охватывают 2 дня.
select
ca2.shift_start
, ca2.shift
, avg(value) avg_value
from table1
cross apply (
select
datediff(hour,'20180101 07:00', dt) % 24 hr
, (datediff(hour,'20180101 07:00', dt) / 24) % 2 dy
) ca1
cross apply (
select case
when ca1.dy = 0 and ca1.hr between 0 and 11 then 'a'
when ca1.dy = 0 and ca1.hr between 12 and 23 then 'b'
when ca1.dy = 1 and ca1.hr between 0 and 11 then 'c'
when ca1.dy = 1 and ca1.hr between 12 and 23 then 'd'
end as shift
, convert(varchar(13),dateadd(hour,-(case when hr < 12 then hr else hr-12 end),dt),121) shift_start
) ca2
group by
ca2.shift_start
, ca2.shift
order by
ca2.shift_start
, ca2.shift
+----+---------------+-------+----------------+
| | shift_start | shift | avg_value |
+----+---------------+-------+----------------+
| 1 | 2018-09-13 07 | c | 30559,01953125 |
| 2 | 2018-09-13 19 | d | 30559,01953125 |
| 3 | 2018-09-14 07 | a | 30559,01953125 |
+----+---------------+-------+----------------+
см .: http://rextester.com/VHQK56298