Ваша проблема в GROUP BY TRUNC (A.time)
- это говорит о том, что нужно начинать окно для каждой строки / дня в полночь и заканчивать в 11:59 следующей ночью. Но вы хотите это с 6 утра текущего дня до 5:59 утра следующего дня. Итак, вы хотите GROUP BY TRUNC(A.time - 6/24)
- таким образом, 5:59 сегодня утром будет засчитано как вчера, а 5:59 завтра будет засчитано как сегодня.
Тогда вы можете изменить ваш случай THREE
на:
count(case when to_char(A.time,'HH24:MI:SS') > '22:00:00'
or to_char(A.time,'HH24:MI:SS') < '06:00:00'
then A.sn end) as THREE
Попробуйте и дайте нам знать, если у вас возникнут проблемы.
select TRUNC(A.time-(6/24)),
count (distinct B.code)as FOUR,
count(case when to_char(A.time,'HH24:MI:SS') between '06:00:00'
and '14:00:00'
then A.sn end) as ONE,
count(case when to_char(A.time,'HH24:MI:SS') between '14:00:00'
and '22:00:00'
then A.sn end) as TWO,
count(case when to_char(A.time,'HH24:MI:SS') > '22:00:00'
or to_char(A.time,'HH24:MI:SS') < '06:00:00'
then A.sn end) as THREE
from B
inner join A
on B.bol_id = A.bol_id
where B.group = '9'
and A.time between '01-JUN-18 06:00:00' and '25-JUN-18 06:00:00'
GROUP BY TRUNC(A.time-(6/24))
Вы также можете изменить ваши дела с between
на > and <=
. between X and Y
включает в себя оба конечных значения, поэтому любые события, происходящие ровно в 2 часа дня, будут дважды учитываться как ОДИН и ДВУХ.