группировка / агрегирование по диапазонам дат - PullRequest
3 голосов
/ 19 июня 2009

Получил таблицу ABC с одним столбцом. Столбец даты "создан". Таким образом, значения образца как;

 created
 2009-06-18 13:56:00
 2009-06-18 12:56:00
 2009-06-17 14:02:00
 2009-06-17 13:12:23
 2009-06-16 10:02:10

Я хочу написать запрос, чтобы результаты были:

count    created
2        2009-06-18
2        2009-06-17
1        2009-06-16

В основном подсчитайте, сколько записей принадлежит каждой дате, но игнорируя время.

Это в PL-SQL с Oracle.

Есть идеи?

Ответы [ 3 ]

11 голосов
/ 19 июня 2009

Функция TRUNC возвращает ДАТУ DATETIME.

select trunc(created),count(*) from ABC group by trunc(created)
2 голосов
/ 19 июня 2009

Просто для полноты я добавлю обобщенный вариант, который работает для произвольно определенных размеров сегментов:

  SELECT trunc( (created - to_date('2000.01.01', 'YYYY.MM.DD'))
                * 24
              ) / 24
         + to_date('2000.01.01', 'YYYY.MM.DD') theDate
       , count(*)
    FROM Layer
GROUP BY trunc( (created - to_date('2000.01.01', 'YYYY.MM.DD'))
                * 24
              ) / 24
         + to_date('2000.01.01', 'YYYY.MM.DD')
ORDER BY 1;

Приведенный выше запрос подсчитает количество часов; используйте что-то меньше 24, чтобы получить большие интервалы, или больше, чтобы создать меньшие интервалы. Изменив положение * и /, вы можете сделать интервалы в днях (например, выполнение "/ 7" вместо "* 24" даст вам интервалы в одну неделю каждый.

2 голосов
/ 19 июня 2009

select count(*), to_char('YYYY-MM-DD', created) from ABC group by to_char('YYYY-MM-DD', created)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...