2012-05-23 8 views
3

Мне нужен SINGLE-запрос, который выполняет эту последовательность в оракуле.Подсчет количества записей по часам между двумя датами в оракуле

select count(*) from table1 
where request_time < timestamp'2012-05-19 12:00:00' and (end_time > timestamp'2012-05-19 12:00:00' or end_time=null); 

select count(*) from table1 
where request_time < timestamp'2012-05-19 13:00:00' and (end_time > timestamp'2012-05-19 13:00:00' or end_time=null); 

select count(*) from table1 
where request_time < timestamp'2012-05-19 14:00:00' and (end_time > timestamp'2012-05-19 14:00:00' or end_time=null); 

select count(*) table1 
where request_time < timestamp'2012-05-19 15:00:00' and (end_time > timestamp'2012-05-19 15:00:00' or end_time=null); 

select count(*) from table1 
where request_time < timestamp'2012-05-19 16:00:00' and (end_time > timestamp'2012-05-19 16:00:00' or end_time=null); 

Как вы видите, время увеличивается один за другим. здесь выход

COUNT(*)    
1085     

COUNT(*)    
1233     

COUNT(*)    
1407     

COUNT(*)    
1322     

COUNT(*)    
1237 

Я написал запрос, но он не дает мне правильного ответа!

select col1, count(*) from 
(select TO_CHAR(request_time, 'YYYY-MM-DD HH24') as col1 from table1 
where request_time <= timestamp'2012-05-19 12:00:00' and (end_time >= timestamp'2012-05-19 12:00:00' or end_time=null)) 
group by col1 order by col1; 

Этот запрос дает мне результирующий набор, что сумма его счета (*) равна первому запросу, написанному выше! вот результат:

COL1   COUNT(*)    
------------- ---------------------- 
2012-05-19 07  22      
2012-05-19 08  141      
2012-05-19 09  322      
2012-05-19 10  318      
2012-05-19 11  282 

ответ

14

Обратите внимание на использование выражения trunc с датой. Вы можете опустить alter session, если вы не используете запрос в sql * plus.

SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'; 

Session altered. 

SQL> SELECT 
     trunc(created,'HH'), 
     count(*) 
    FROM 
     test_table 
    WHERE 
     created > trunc(SYSDATE -2) 
    group by trunc(created,'HH'); 


TRUNC(CREATED,'HH') COUNT(*) 
------------------- ---------- 
2012-05-21 09:00:00  748 
2012-05-21 16:00:00   24 
2012-05-21 17:00:00   12 
2012-05-21 22:00:00  737 
2012-05-21 23:00:00  182 
2012-05-22 20:00:00   16 
2012-05-22 21:00:00  293 
2012-05-22 22:00:00  610 

8 ROWS selected. 
+0

Спасибо, но это дает мне тот же результат, который я написал группой.Вопрос в том, что мне нужна сумма за час 22:00:00, которая в вашем примере будет 748 + 24 + 12 + 737 + 182 + 16 + 293 + 610 = 2622, а для часа 16:00:00 это должно быть 748 + 24 = 772 и так далее ... – Heidarzadeh

+0

Я думаю, что я тебя не понимаю. – ipip

+0

@Heidarzadeh: Если вы говорите об общей сумме 'COUNT (*)', попробуйте решение ipip с 'count (*)' заменено на 'sum (count (*)) over (order by trunc (created, 'HH')) '. –

1

Ваших индивидуальных запросов, кажется, соответствие перекрывающихся наборов записей. Это поможет, если вы включили некоторые выборочные данные в свой вопрос, но я могу догадаться ...

Например, все записи, имеющие end_time = null и request_time = 2012-05-19 13:30:00 будет учитываться как первым, так и вторым запросом; но они будут учитываться только один раз в вашем «общем» запросе.

Возможно, вы хотели запросить диапазон дат в request_time, вместо того, чтобы иметь открытый предикат типа request_time < timestamp'2012-05-19 12:00:00'?

+0

«будет учитываться обоими первый и второй запросы «да, мне это нужно. что-то вроде фибоначчи! отсчет этого часа - количество предыдущих часов + счет этого часа. – Heidarzadeh

+0

У меня две даты, и я хочу рассчитать этот запрос между двумя датами. то я хочу расширить этот запрос, чтобы получить результат по дням, месяцам и даже годам! – Heidarzadeh

1

Для базы данных Oracle ее работающая как ожидалось.

ВЫБРАТЬ to_char (обновлено, 'DD-MM-YYYY HH'), COUNT (*) FROM клиент ГДЕ TRUNC (обновлено)> = to_char ('02 -JUL-2017') И TRUNC (обновлено) < = to_char ('02 -JUL-2017 ') группа по to_char (обновлено,' DD-MM-YYYY HH ')

0

Попробуйте

select TO_CHAR(request_time, 'HH24') as "hourOfDay",count(*)as 
"numOfLogin", TO_CHAR(request_time, 'DD') as "date" from table1 
where request_time<= timestamp'2017-08-04 23:59:59' and 
(request_time>= timestamp'2017-08-03 00:00:01') group by 
TO_CHAR(request_time, 'HH24'),TO_CHAR(request_time, 'DD');