0

我有一个表:每次用户打开页面时都会插入一个新字段时的用户ID时间戳。

我正在尝试获取多个用户在 1 个月间隔内出现的小时/分钟//周的总数。

我尝试了一堆不同的查询,但每个查询都非常低效。

理想情况下,我希望得到类似的结果:

   userid | minutes | hours | days | weeks
      1      10080     168      7      1
      2       1440      24      1      0

希望有人可以阐明如何做到这一点。

以下是我尝试过的查询:

  SELECT 
    w.time AS `week`, 
    d.time AS `day`, 
    h.time AS `hour`, 
    m.time AS `minutes`
    FROM (
             SELECT 
            SUM( t.time ) AS `time`
             FROM (
                    SELECT 
                    COUNT( DISTINCT WEEK( `timestamp` ) ) AS `time`
                FROM table
                    WHERE 
                    userid =  "1"
                    AND 
                    `timestamp` > DATE_SUB( NOW( ) , INTERVAL 1 MONTH ) 
                    GROUP BY MONTH( `timestamp` )
                    ) t
         ) w, 
        (
             SELECT 
            SUM( t.time ) AS `time`
             FROM (
                    SELECT 
                    COUNT( DISTINCT DAY( `timestamp` ) ) AS `time`
                    FROM table
                    WHERE 
                    userid =  "52"
                    AND 
                    `timestamp` > DATE_SUB( NOW( ) , INTERVAL 1 MONTH ) 
                    GROUP BY MONTH( `timestamp` )
             ) t
            ) d,
         (
        SELECT 
            SUM( t.timestamp ) AS `time`
            FROM (
                SELECT 
                    COUNT( DISTINCT HOUR( `timestamp` ) ) AS `time`
                    FROM table
                    WHERE 
                    userid =  "1"
                    AND 
                    `timestamp` > DATE_SUB( NOW( ) , INTERVAL 1 MONTH ) 
                GROUP BY DAY( `timestamp` )
                 ) t
            ) h, 
        (
            SELECT 
            SUM( t.timestamp ) AS `time`
            FROM (
                SELECT 
                    COUNT( DISTINCT MINUTE( `timestamp` ) ) AS `time`
                 FROM table
                WHERE 
                    userid =  "1"
                AND 
                    `timestamp` > DATE_SUB( NOW( ) , INTERVAL 1 MONTH ) 
                    GROUP BY HOUR( `timestamp` )
             ) t
         ) m

这项任务似乎太过分了,也许有人有更好的东西?

4

2 回答 2

1
SELECT userid, SUM(MINUTE(timestamp)) AS minutes, SUM(MINUTE(timestamp))/60 AS hours, SUM(MINUTE(timestamp))/(60*24) AS days, SUM(MINUTE(timestamp))/(60*24*7) AS weeks
FROM Table
GROUP BY userid

如果需要,ROUND(SUM(MINUTE(timestamp)), 0)请在需要整数时使用。

于 2012-07-27T03:47:06.107 回答
1

我不清楚你想要“总计”什么。

如果您想确定用户在一个月内的任何给定分钟是否有“命中”(或您存储在表中的任何事务),然后您想计算一个“分钟周期”的数量用户点击的月份:

 SELECT t.userid
      , COUNT(DISTINCT DATE_FORMAT(t.timestamp,'%Y-%m-%d %H:%i')) AS minutes
      , COUNT(DISTINCT DATE_FORMAT(t.timestamp,'%Y-%m-%d %H'   )) AS hours
      , COUNT(DISTINCT DATE_FORMAT(t.timestamp,'%Y-%m-%d'      )) AS days
      , COUNT(DISTINCT DATE_FORMAT(t.timestamp,'%X-%V'         )) AS weeks
 FROM mytable t
WHERE t.timestamp >= '2012-06-01'
  AND t.timestamp <  '2012=07-01'
GROUP BY t.userid 

这样做的目的是获取每个时间戳,并将其放入“桶”中,方法是切断秒、切断分钟、切断时间等。

基本上,我们正在获取时间戳(例如'2012-07-25 23:15:30')并将其分配给

minute '2012-07-25 23:15'
hour   '2012-07-25 23'
day    '2012-07-25'

的时间戳 '2012-07-25 23:25:00'将被分配给

minute '2012-07-25 23:25'
hour   '2012-07-25 23'
day    '2012-07-25'

然后我们遍历并计算我们分配时间戳的不同存储桶的数量。如果这是该用户在该月的所有点击量,则查询将返回 2 表示分钟数,返回 1 表示所有其他周期计数。

对于一个月内有单次点击的用户,该用户的所有计数都将为 1。

对于在同一分钟内获得所有“命中”的用户,查询将再次为所有计数返回 1。

(对于一个月内没有“点击”的用户,不会返回任何行。(如果您想返回零计数,则需要加入另一个行源以获取用户列表。)

对于在一天内每秒都有“命中”的用户,此查询将返回与示例中用户 ID 2 显示的计数类似的计数。

这个结果集为您提供了一个月内用户活动的一种指示……用户在一个月内有多少“分钟时段”处于活动状态。

可以为“天”返回的最大值是该月的天数。“小时”返回的最大可能值将是该月时间中天数的 24 倍。“分钟”返回的最大可能值将是该月天数的 1440 倍。

但同样,我并不完全清楚您想要返回什么结果集。但这似乎比以前“选择”答案中的结果集更合理。

于 2012-07-27T05:40:06.143 回答