Группировка часов по моменту дня - PullRequest
3 голосов
/ 08 ноября 2011

Мне нужно было бы выбрать самый распространенный момент дня (рассвет, утро, вечер, ночь) в группе записей.Я пытаюсь сгруппировать результаты в моменты, используя CASE-WHEN, но я не могу сравнить дату и целое число.Я пытаюсь это:

SELECT done_at,
  case done_at
  when date_trunc('hour', done_at) > 0 and date_trunc('hour', done_at) <= 7 then
    'dawn'
  when dayhour > 7 and dayhour <= 12 then
    'morning'
  when dayhour > 12 and dayhour <= 20 then
    'evening'
  when dayhour > 20 and dayhour <= 00 then
    'night'
  end
FROM iterations;

Но с этим я получаю эту ошибку:

PGError: ERROR:  operator does not exist: timestamp without time zone > integer
LINE 3:       when date_trunc('hour', done_at) > 0 and date_trunc('h...

Я также пытался привести тип к целому числу, но я получаю это:

PGError: ERROR:  cannot cast type timestamp without time zone to integer
LINE 3:       when date_trunc('hour', done_at)::integer > 0 and date...

Дело в том, что у done_at есть часовой пояс.С консоли Rails:

?> Iteration.first.done_at
=> Fri, 23 Sep 2011 02:00:00 CEST +02:00

А теперь я не в курсе.

Любой намек или какой-либо другой способ получить момент дня?

Ответы [ 2 ]

2 голосов
/ 08 ноября 2011

Запрос может выглядеть следующим образом:

SELECT CASE 
        WHEN h > 0  AND h <= 7  THEN 'dawn'
        WHEN h > 7  AND h <= 12 THEN 'morning'
        WHEN h > 12 AND h <= 20 THEN 'evening'
        WHEN h > 20             THEN 'night'
       END AS moment
       ,count(*) AS cnt
FROM  (
    SELECT extract(hour from done_at) AS h
    FROM   iterations
    ) x
GROUP  BY 1
ORDER  BY count(*) DESC
LIMIT  1;

Основные точки:

  • @ lanzz верен примерно extract()
  • Используйте подзапрос для вычислениячас дня, чтобы значительно упростить код.
  • GROUP BY, count, ORDER BY и LIMIT могут происходить на одном уровне запроса.
  • Результат - самый распространенный момент дня согласно запросу.
1 голос
/ 08 ноября 2011

Вы хотите extract(hour from done_at) вместо date_trunc('hour', done_at)

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