获取一周中每天mysql的统计信息

时间:2018-02-21 15:49:45

标签: mysql sql gaps-and-islands

我有一张这样的表

Click ID   |    click_user_id | click_time (timestamp) 
-----------------------------------------------------
1          |      1           |       1518810765
-----------------------------------------------------
2          |      2           |       1518845445
-----------------------------------------------------
3          |      2           |       1518945445
-----------------------------------------------------

如何获得一周中每天收到的点击次数(使用mysql)。 结果应如下所示:

"mon":50
"tue":20
.
.
.
"sun":100

谢谢。

*编辑:

  • 1.如果当天没有记录,则显示0
  • 2.不限于一周(显示每周一记录的结果)
  • 3.输出并不重要。日期也可以表示为数字。表格形式也没问题。

2 个答案:

答案 0 :(得分:4)

click_time (timestamp)转换为星期几。

MySQL提供了一些有用的功能。 FROM_UNIXTIMEDATE_FORMAT

https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_date-format

https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_from-unixtime

作为示范:

SELECT DATE_FORMAT(FROM_UNIXTIME( 1518945445 ),'%a') AS day_of_week

我们可以用

中的列引用替换文字
SELECT DATE_FORMAT(FROM_UNIXTIME( t.click_time ) ,'%a') AS day_of_week
     , t.*
  FROM a_table_like_this t
 WHERE ...

要计算day_of_week的每个不同值的计数,我们的计算方法与click_user_id

计算的方式相同
SELECT t.click_user_id 
     , SUM(1) AS cnt
  FROM a_table_like_this t   
 WHERE ...
 GROUP BY t.click_user_id

只需使用返回t.click_user_id的表达式替换day_of_week的出现次数。

要按规定格式化结果,请考虑使用LOWERCONCATENATE函数使用外部查询。

要对行进行排序,请考虑添加另一个表达式,该表达式返回星期几的升序值,例如DATE_FORMAT( ,'%w')

SELECT CONCATENATE('"',LOWER(v.day_of_week),'":',v.cnt) AS foo
  FROM ( 
         SELECT ...     AS day_of_week
              , ...     AS cnt 
              , ...     AS daynumber
           FROM a_table_like_this t
          GROUP BY ...
       ) v
 ORDER BY v.daynumber

答案 1 :(得分:1)

这可能会伤害眼睛,但我们会加入以下内容:

  • data:根据您的数据对每个工作日的计数进行分组
  • weekdays:工作日名称​​和其(ODBC)订单的派生表

第二个表为您的数据中任何理论上“缺失”的天提供行。我们实现它的方式也让这项工作无论你的语言环境如何。 (我的星期一是“星期一”,但你的星期一可能是“poniedziałek”。)

SELECT weekdays.dow, COALESCE(num_clicks, 0) FROM
       (SELECT DAYNAME(FROM_UNIXTIME(click_time)) AS "dow",
               COUNT(1) AS "num_clicks"
          FROM tbl
         GROUP BY 1) data
 RIGHT JOIN
       (SELECT DAYNAME(CURRENT_DATE - INTERVAL i DAY) AS dow,
               DAYOFWEEK(CURRENT_DATE) AS dayorder
          FROM numbers
               WHERE
               i BETWEEN 0 AND 6) weekdays
       ON
        data.dow = weekdays.dow
 GROUP BY 1
 ORDER BY weekdays.dayorder ASC

numbers表有一列i,其INT值范围从0到...大于6的值。如果你没有数字表,你可以自己做派生表:

...
-- Let's start with the first Sunday in recorded history:
(SELECT DAYNAME("1970-01-04") AS dow, 0 AS dayorder
  UNION ALL
 SELECT DAYNAME("1970-01-05"), 1
  UNION ALL
 ...)