获取一周中每一天的统计数据 mysql
Get statistics for each day of the week mysql
我有一个table这样的
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.If当天没有记录显示0
- 2.Not 限制为一周(显示有史以来每个星期一的结果)
- 3.Output 并不是很重要。天数也可以用数字表示。表格形式也行。
将 click_time (timestamp)
转换为星期几。
MySQL 提供了一些有用的功能。 FROM_UNIXTIME
和 DATE_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
替换为 returns day_of_week
的表达式。
要获得指定格式的结果,请考虑使用 LOWER
和 CONCATENATE
函数的外部查询。
为了对行进行排序,考虑添加另一个表达式 returns 星期几的升序值,例如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
这可能会有点伤眼,但我们会加入以下内容:
data
:您数据中每个工作日的计数分组
weekdays
:派生 table 工作日名称 和 他们的 (ODBC) 顺序
第二个 tables 提供理论上任何 "missing" 天数据的行。我们实施它的方式也让这项工作无论您的语言环境如何。 (我的星期一是 "Monday",但你的可能是 "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
table 有一个列 i
其 INT 值范围从零到...大于 6。如果你没有数字 table, 你可以在派生的 table:
中自己做
...
-- 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
...)
我有一个table这样的
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.If当天没有记录显示0
- 2.Not 限制为一周(显示有史以来每个星期一的结果)
- 3.Output 并不是很重要。天数也可以用数字表示。表格形式也行。
将 click_time (timestamp)
转换为星期几。
MySQL 提供了一些有用的功能。 FROM_UNIXTIME
和 DATE_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
替换为 returns day_of_week
的表达式。
要获得指定格式的结果,请考虑使用 LOWER
和 CONCATENATE
函数的外部查询。
为了对行进行排序,考虑添加另一个表达式 returns 星期几的升序值,例如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
这可能会有点伤眼,但我们会加入以下内容:
data
:您数据中每个工作日的计数分组weekdays
:派生 table 工作日名称 和 他们的 (ODBC) 顺序
第二个 tables 提供理论上任何 "missing" 天数据的行。我们实施它的方式也让这项工作无论您的语言环境如何。 (我的星期一是 "Monday",但你的可能是 "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
table 有一个列 i
其 INT 值范围从零到...大于 6。如果你没有数字 table, 你可以在派生的 table:
...
-- 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
...)