Как мы можем превратить данные таблицы PostgreSQL в данные тепловой карты? - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть таблица, содержащая user_id, date и time

user_id    date       time
129629  2018-11-01  01:18:50 PM
188747  2018-11-02  02:18:50 PM
261476  2018-11-03  06:18:50 PM
101866  2018-11-04  02:19:36 PM
156421  2018-11-05  06:23:01 PM
190261  2018-11-06  01:23:01 PM
247427  2018-11-07  05:23:01 PM
247579  2018-11-08  03:23:01 PM
170536  2018-11-09  01:23:42 PM
186961  2018-11-10  04:24:51 PM
118408  2018-11-11  01:18:50 PM
900006  2018-11-12  02:18:50 PM
900095  2018-11-13  01:18:50 PM
162458  2018-11-14  02:19:36 PM
100881  2018-11-15  06:23:01 PM
136095  2018-11-16  01:23:01 PM
100881  2018-11-17  05:23:01 PM
900058  2018-11-18  03:23:01 PM
134921  2018-11-19  02:18:50 PM
162873  2018-11-20  01:24:51 PM

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

           sun  mon tue wed thu fri sat
01:00:00 PM 1   0   3   0   1   2   0
02:00:00 PM 1   2   0   1   0   1   0
03:00:00 PM 1   0   0   0   1   0   0
04:00:00 PM 0   0   0   0   0   0   1
05:00:00 PM 0   0   0   1   0   0   1
06:00:00 PM 0   1   0   0   1   0   1

Пока с помощью этого запроса я могу получить список дат только в промежутке времени.

select date from user_visits where time >='01:00:00' and time <='01:59:59'

Я не могу понять, как форматировать данные, как в данном примере.

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Используйте функции даты / времени :

date_part('hour', time) -- gives time rounded to hour
extract(dow from date) -- returns day of week from date

Запрос:

select 
    date_part('hour', time) as hour, 
    sum((extract(dow from date) = 0)::int) as sun,
    sum((extract(dow from date) = 1)::int) as mon,
    sum((extract(dow from date) = 2)::int) as tue,
    sum((extract(dow from date) = 3)::int) as wed,
    sum((extract(dow from date) = 4)::int) as thu,
    sum((extract(dow from date) = 5)::int) as fri,
    sum((extract(dow from date) = 6)::int) as sat
from user_visits 
group by hour
order by hour

Проверьте его в rextester.

0 голосов
/ 05 декабря 2018

Отфильтрованный агрегат - это самый простой способ сделать это:

SELECT date_trunc('hour', time) AS hour,
       count(*) FILTER (WHERE EXTRACT(dow FROM date) = 0) AS sun,
       count(*) FILTER (WHERE EXTRACT(dow FROM date) = 1) AS mon,
       count(*) FILTER (WHERE EXTRACT(dow FROM date) = 2) AS tue,
       count(*) FILTER (WHERE EXTRACT(dow FROM date) = 3) AS wed,
       count(*) FILTER (WHERE EXTRACT(dow FROM date) = 4) AS thu,
       count(*) FILTER (WHERE EXTRACT(dow FROM date) = 5) AS fri,
       count(*) FILTER (WHERE EXTRACT(dow FROM date) = 6) AS sat 
FROM user_visits GROUP BY hour
ORDER BY hour;

   hour   | sun | mon | tue | wed | thu | fri | sat 
----------+-----+-----+-----+-----+-----+-----+-----
 13:00:00 |   1 |   0 |   3 |   0 |   1 |   2 |   0
 14:00:00 |   1 |   2 |   0 |   1 |   0 |   1 |   0
 15:00:00 |   1 |   0 |   0 |   0 |   1 |   0 |   0
 16:00:00 |   0 |   0 |   0 |   0 |   0 |   0 |   1
 17:00:00 |   0 |   0 |   0 |   1 |   0 |   0 |   1
 18:00:00 |   0 |   1 |   0 |   0 |   1 |   0 |   1
(6 rows)

Примечания:

  • Я предположил, что вы используететипы данных date и time without time zone.

  • Было бы лучше хранить один timestamp with time zone вместо двух полей.

  • В запросе используется стандартный SQL, но я не знаю, поддерживает ли MySQL все используемые функции.

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