Mysql 如何将PostgreSQL表的数据转换为热图数据?

Mysql 如何将PostgreSQL表的数据转换为热图数据?,mysql,sql,postgresql,Mysql,Sql,Postgresql,我有一个包含用户id、日期和时间的表 我想从以下示例中的特定数据创建访客热图: 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

我有一个包含用户id、日期和时间的表

我想从以下示例中的特定数据创建访客热图:

           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'

我无法理解如何像给定的示例那样格式化数据。

过滤聚合是最简单的方法:

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

最好存储一个带有时区的时间戳,而不是两个字段

该查询使用标准SQL,但我不知道MySQL是否支持所有使用的功能

使用:

查询:

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

这是为mysql和postgresql标记的。您使用的是哪一个?我使用的是postgreSQL,但MYSQLSir中也有相同的表。是否有任何方法可以选择像星期二这样的一天,它只显示大于零的天数?结果将是一个小时——太阳、星期一、星期二、星期三、星期四、星期五、星期六、星期六、星期五、星期五、星期五、星期五、星期五、星期五、星期五、星期五、星期五、星期五、星期五、星期五、星期五、星期五、星期五、星期五、星期五、星期五、星期五、星期五、星期五、星期五、星期五、星期六、星期五、星期五、星期六、星期五、星期五、星期五、星期五、星期五、星期五、星期六、星期五、星期五、星期六、星期六、星期五、星期六、星期六、星期六、星期
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