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