我有一个表格,其中包含有关向我的网站发布消息的用户的信息。该表名为logs
并具有以下记录:id, epoch, username, msg
(epoch是发布时的unix时期,msg是发布的消息)
我决定将这一天分为4个部分,每个部分为6个小时(0-5,6-11,12-17,18-23)。
我想确定用户在每个细分中发布的帖子百分比。
有没有什么好方法可以用一个SQL查询来做到这一点?如果我必须按照下面的用户名进行4次查询,则需要永远。
SELECT count( num )
FROM `logs`
WHERE username = 'bob'
AND from_unixtime( epoch )
BETWEEN date_sub( now( ) , INTERVAL 1 week )
AND now( )
AND hour( from_unixtime( epoch ) )
BETWEEN 0
AND 5
上面的查询告诉我bob在过去一周的0到5小时之间发了多少帖子。这感觉非常低效,因为如果查询可以只加载所有bobs帖子,获取我需要的所有数据,然后返回它,那可能会更好;而不是必须加载他的帖子5次不同(#1获得总帖子,#2 / 3/4/5在特定小时范围内获得他的帖子)
我的目标是获取bob在一个查询中所做的所有帖子,除以一天中的不同时间(即0到5小时,小时6和11,小时12和17,小时18和23)。然后我可以通过bobs总帖子来划分这些个人信息,例如看到bob在第6和第11小时发布了80%的帖子等等
通过这种方式,我可以确切了解bob何时处于活动状态
答案 0 :(得分:3)
cvlc -vvv stream:///rtsp://0.0.0.0:8554/}' --sout=file/ps:record.mpg
如果您希望相同的查询也为您提供整天的统计信息,请将create table buckets(int low, int hi);
insert into buckets values(0, 5), (6, 11), (12, 17), (18, 23);
SELECT `low`, `hi`, count( num )
FROM `logs`, `buckets`
WHERE username = 'bob'
AND from_unixtime( epoch )
BETWEEN date_sub( now( ) , INTERVAL 1 week )
AND now( )
AND hour( from_unixtime( epoch ) )
BETWEEN `buckets`.`low`
AND `buckets`.`hi`
GROUP BY `buckets`.`low`;
插入到存储桶中以及其他四个值。
更新:正如评论中指出的halfer,您的时间间隔也可以按(0, 23)
分组:
hour div 6
答案 1 :(得分:1)
我会改用这样的东西:
select count(msg) as TotalMsg,
sum(CASE WHEN (epoch MOD 86400)<21600 THEN 1 ELSE 0 END) as Period_1,
sum(CASE WHEN (epoch MOD 86400)>=21600 AND (epoch MOD 86400)<43200 THEN 1 ELSE 0 END) as Period_2,
sum(CASE WHEN (epoch MOD 86400)>=43200 AND (epoch MOD 86400)<64800 THEN 1 ELSE 0 END) as Period_3,
sum(CASE WHEN (epoch MOD 86400)>=64800 THEN 1 ELSE 0 END) as Period_4
from logs
where username='bob';
# 86400 = seconds in 24 hours