ключевых элементов элегантного решения являются generate_series()
, date_part()
, A CTE, GROUP BY
и count(*)
, LEFT JOIN
и последнее: crosstab()
функция (с 1 параметром) из дополнительного модуля tablefunc. Чтобы установить его, запустить раз в базе данных:
CREATE EXTENSION tablefunc;
запрос:
SELECT *
FROM crosstab($x$
WITH x AS (
SELECT date_part('day', date_time_of_task)::int AS d
,date_part('hour', date_time_of_task)::int AS h
,count(*)::int AS ct
FROM tasks
GROUP BY 1,2
)
SELECT d, h, ct
FROM (SELECT generate_series(1,31) AS d, generate_series(0,23) AS h) t
LEFT JOIN x USING (d,h)
ORDER BY 1,2
$x$)
AS orders(
day int
,h8 int, h9 int, h10 int, h11 int, h12 int, h13 int, h14 int, h15 int
,h16 int, h17 int, h18 int);
производит матрицу дней и часов с графом задач в каждой области, как вы описали.
BTW: Я использовал этот aux. Функция для создания списка определений цели:
SELECT 'day int, ' || string_agg (x, ', ')
FROM (SELECT ('h' || generate_series(8,18) || ' int') AS x) a
Пусть я таблица называется «задача» с идентификатором поля, date_time_of_task, fk_who_did_it –
Сделали вы либо 'заявление SELECT' в SQL раньше? Если вы знаете, как устроить сетку, то вы на полпути. Попытайтесь понять логику, используемую для ее построения. Я предлагаю сделать несколько широких запросов и опубликовать ваши попытки, затем другие могут прийти и помочь вам уточнить ваш запрос для создания отчета. Вы должны хотя бы приложить некоторые усилия! – Zairja
Я знаю немного SQL ... проблема в том, как отделить результаты за час? Я никогда не делал этого раньше =/ –