Группировка записей час за часом или день за днем и заполнение пробелов нулями или нулями

Я написал запрос, который считает записи час за часом:

select TO_CHAR(copied_timestamp, 'YYYY-MM-DD HH24'),count(*) from req group by
TO_CHAR(copied_timestamp, 'YYYY-MM-DD HH24');

результат:

2012-02-22 13    2280
2012-02-22 15    1250
2012-02-22 16    1245
2012-02-22 19    1258

Но мне нужен такой результат:

2012-02-22 13    2280
2012-02-22 14    0
2012-02-22 15    1250
2012-02-22 16    1245
2012-02-22 17    0
2012-02-22 18    0
2012-02-22 19    1258

Также у меня есть эти запросы, которые группируются по дням и месяцам тоже!

select TO_CHAR(copied_timestamp, 'YYYY-MM-DD'),count(*)  from req
group by TO_CHAR(copied_timestamp, 'YYYY-MM-DD');

select TO_CHAR(copied_timestamp, 'YYYY-MM'),count(*)  from req
group by TO_CHAR(copied_timestamp, 'YYYY-MM');

Мне нужно, чтобы их пробелы были заполнены нулями или нулями. Любая помощь очень ценится.

 Heidarzadeh29 мая 2012 г., 14:42
Я использую нативные запросы JPA, поэтому думаю, что с pl / sql проблем не будет.
 Heidarzadeh25 июн. 2012 г., 12:11
Кто-нибудь знает, как обрабатывать такие запросы в Mysql?
 Sebas29 мая 2012 г., 14:29
Вы могли бы использовать pl / sql?

Ответы на вопрос(1)

Решение Вопроса

пытаться:
первый запрос (по часам):

with t as (
  select mnd + ((level-1)/24) ddd
  from
  (select trunc(min(copied_timestamp),'hh') mnd, trunc(max(copied_timestamp),'hh') mxd from req) v
  connect by mnd + ((level-1)/24) <= mxd
  )
select to_char(trunc(d1, 'hh'), 'yyyy-mm-dd hh24'), count(d2) from 
(select nvl(copied_timestamp, ddd) d1, copied_timestamp d2 from req right outer join (
  select ddd from t) ad on ddd = trunc(copied_timestamp, 'hh'))
group by trunc(d1, 'hh');

второй запрос (по дням):

with t as (
      select mnd + level-1 ddd
      from
      (select trunc(min(copied_timestamp),'dd') mnd, trunc(max(copied_timestamp),'dd') mxd from req) v
      connect by mnd + level-1 <= mxd
      )
    select to_char(trunc(d1, 'dd'), 'yyyy-mm-dd'), count(d2) from 
    (select nvl(copied_timestamp, ddd) d1, copied_timestamp d2 from req right outer join (
      select ddd from t) ad on ddd = trunc(copied_timestamp, 'dd'))
    group by trunc(d1, 'dd');

третий запрос (по месяцам):

with t as (
      select add_months(mnd, level-1) ddd
      from
      (select trunc(min(copied_timestamp),'mm') mnd, trunc(max(copied_timestamp),'mm') mxd from req) v
      connect by add_months(mnd, level-1) <= mxd
      )
    select to_char(trunc(d1, 'mm'), 'yyyy-mm'), count(d2) from 
    (select nvl(copied_timestamp, ddd) d1, copied_timestamp d2 from req right outer join (
      select ddd from t) ad on ddd = trunc(copied_timestamp, 'mm'))
    group by trunc(d1, 'mm');
 29 мая 2012 г., 15:20
вот скрипкаsqlfiddle.com/#!4/6b5f5/10
 29 мая 2012 г., 15:12
Попробуйте заменитьtrunc(d1, 'hh') сto_char(trunc(d1, 'hh'), 'yyyy-mm-dd hh24'), Что касается других запросов, они должны быть одинаковыми, просто обрезать их в соответствии с & quot; днём & quot; сdd или "месяц" сmm (просто заменитеhh)
 30 мая 2012 г., 08:04
Вы правы, конечно, уровень представляет собой целое число, представляющее изменение, если вы добавите его вdate типа это добавляет дни, поэтому только для часов имеет смысл разделить на 24. Исправить несложно: для использования днейmnd+level и в течение нескольких месяцев использованияadd_months(mnd, level), Я думал о другой вещи - уровень начинается с 1, поэтому в основном вам нужно использоватьlevel-1, Я также подумал, что лучше урезать минимальные / максимальные даты во внутреннем запросе. Итак, вот новая скрипка:sqlfiddle.com/#!4/6b5f5/21 Если он работает правильно, я обновлю свой ответ (скрипка не останется навсегда ...)
 Heidarzadeh29 мая 2012 г., 14:58
Спасибо A.B.Cade, это работает, но я не вижу часа в первой колонке. я просто вижу день-месяц-год! Я думаю, что это из-за функции усечения. как я могу использовать это, чтобы показать час тоже? Может быть, это из-за SQL-разработчика, который не показывает час? Кстати, как насчет второго и третьего запроса?
 29 мая 2012 г., 15:43
это отличный алгоритм, спасибо, сегодня я многому научился!

Ваш ответ на вопрос