我需要在应用程序中收集一些统计信息。我有一个用户表(tb_user),每当一个新用户访问该应用程序时,它将在该表中添加一条新记录,即每个用户一行。主要字段是
id 和 date_hour (用户首次访问该应用程序的时间戳)。
tb_user
id (bigint) | date_time (timestamp with time zone)
1 | 2012-01-29 11:29:50.359-03
2 | 2012-01-31 14:27:10.359-03
我需要得到:
按日,周和月划分的平均用户数
例子:
每天:55.45
每周:XX.XX
月:XX.XX
编辑:
我最好的解决方案是:
WITH daily_count AS (SELECT COUNT(id) AS user_count FROM tb_user)
SELECT user_count, tbaux2.days, (user_count/tbaux2.days) FROM daily_count,
(SELECT EXTRACT(DAY FROM (t2.diff) ) + 1 AS days
FROM
(with tbaux AS(SELECT min(date_time) AS min FROM tb_user)
SELECT (now() - min) AS diff
FROM tbaux) AS t2) AS tbaux2
GROUP BY user_count, tbaux2.days
但是,此解决方案仅适用于EXTRACT(DAY …带星期和一个月的日期不起作用
欢迎任何帮助。
或者:
SELECT user_count, tbaux2.days, (user_count/tbaux2.days) AS userPerDay, ((user_count/tbaux2.days) * 7) AS userPerWeek, ((user_count/tbaux2.days) * 30) AS userPerMonth
编辑2:
根据@Bruno的回复,有一些注意事项:
当我问这个问题时,实际上是要求一种按日,月和年选择数据的方法。我认为,我发布并@Bruno完善的搜索结果应被解释为 “每天,每7天和每30天”的
平均值,而不是几天,几周和几个月的时间。我相信,如果以这种方式进行解释,示例中不会出现性别引用的问题(下降10%)。我相信这种“每一个”方法都是我需要的答案,因此请在此答案上签名。
我建议作为帖子的改进:
谢谢。
您应该查看汇总函数(最小值,最大值,计数,平均值),它们与并驾齐驱GROUP BY
。对于基于日期的聚合,date_trunc
也很有用。
例如,这将返回每天的行数:
SELECT date_trunc('day', date_time) AS day_start,
COUNT(id) AS user_count FROM tb_user
GROUP BY date_trunc('day', date_time);
然后,您可以使用以下方法(使用CTE)进行每日平均:
WITH daily_count AS (SELECT date_trunc('day', date_time) AS day_start,
COUNT(id) AS user_count FROM tb_user
GROUP BY date_trunc('day', date_time))
SELECT AVG(user_count) FROM daily_count;
使用'week'
而不是一天作为每周计数,依此类推(请参阅date_trunc
文档)。
编辑:( 以下评论:2012年5月1日及之前的平均值,即6日之前。)
WITH daily_count AS (SELECT date_trunc('day', date_time) AS day_start,
COUNT(id) AS user_count
FROM tb_user
WHERE date_time >= DATE('2012-01-01') AND date_time < DATE('2012-01-06')
GROUP BY date_trunc('day', date_time))
SELECT SUM(user_count)/(DATE('2012-01-06') - DATE('2012-01-01')) FROM daily_count;
在这种情况下,以上内容过于复杂。这应该给您相同的结果:
SELECT COUNT(id)/(DATE('2012-01-06') - DATE('2012-01-01'))
FROM tb_user
WHERE date_time >= DATE('2012-01-01') AND date_time < DATE('2012-01-06');
编辑2: 编辑后,我想您所追求的只是数据库存在整个期间的单个全球平均值,而不是按月/周/日分组。
这应该为您提供每天的平均行数:
WITH total_min_max AS (SELECT
COUNT(id) AS total_visits,
MIN(date_time) AS first_date_time,
MAX(date_time) AS last_date_time,
FROM tb_user)
SELECT total_visits/((last_date_time::date-first_date_time::date)+1) AS users_per_day
FROM total_min_max
(我将取代last_date_time
以NOW()
使平均值的时间到现在为止,而不是直到最后一次访问,如果没有最近的一次访问。)
然后,对于每天,每周和“每月”:
WITH daily_avg AS (
WITH total_min_max AS (SELECT
COUNT(id) AS total_visits,
MIN(date_time) AS first_date_time,
MAX(date_time) AS last_date_time,
FROM tb_user)
SELECT total_visits/((last_date_time::date-first_date_time::date)+1) AS users_per_day
FROM total_min_max)
SELECT
users_per_day,
(users_per_day * 7) AS users_per_week,
(users_per_month * 30) AS users_per_month
FROM daily_avg
话虽如此,您从此类统计数据得出的结论可能并不理想,特别是如果您想查看其变化情况。
我还将每天对数据进行归一化,而不是假设一个月中有30天(如果不是每小时,因为 并非所有天数都是24小时
)。假设您在2011年1月每天有10次访问,在2011年2月每天有10次访问。也就是说,您1月有310次访问,2月有280次访问。访客人数下降了10%,因此2月份出了点问题,实际上并非如此。
在我的项目中,我正在从数据库/sql迁移到金珠/gorm。以前,我用方法捕获了我的数据库情况。我想知道如何在GORM中实现这一点?我在官方文件中什么也没找到。
在 JavaScript 中怎样正确获取字符个数 console.log('ab����'.length) // 打印结果: 6 我想要的 3 个字符 有没有能通用函数应对所有类型字符串
问题内容: 我正在开发一个应用程序,它可以检查android上的wifi和移动流量统计信息。这就是我得到的统计信息: 不幸的是,这似乎不仅仅是wifi,因为即使我在智能手机上禁用wifi,它也会为我带来大量数据。我认为,并且正在计算所有网络接口上发送和接收的字节数。 我在网上搜索了很多关于如何仅在wifi上获取流量统计信息的方法,但我找不到方法。 我很乐意接受任何帮助。 问题答案: 几年前,我遇到
使用指南 - 代码安装 - 代码跟踪 - 如何获取统计代码 获取统计代码的具体方法如下: 登录您的百度统计帐户。 选择“管理”标签。 在左侧导航中选择“代码管理->代码获取”。 从右上角的“站点选择”的下拉菜单中选择目标站点。 复制代码后,按照安装说明将代码添加到网站中。 此处默认显示异步分析代码(建议使用此代码),如需更改代码,请在获取框的右下角选择,可以选择的代码有:高级定制代码、老版同步代码
问题内容: 我已经在数据库中编写了一个简单的函数。从我的源代码中,我像这样调用此函数 我的数据正确无误,但数据集的表头显示的是我的函数名(),而不是和。在这种情况下如何获取数据? 目前的输出是 但是我想输出如下: 我正在努力实现以下目标: 以下查询工作正常: 问题答案: 当函数返回结果集时,您应该使用。 不要将用于设置返回函数的调用放入选择列表。
本文向大家介绍mysql 获取规定时间段内的统计数据,包括了mysql 获取规定时间段内的统计数据的使用技巧和注意事项,需要的朋友参考一下 mysql 获取规定时间段内的统计数据 按年统计 按月统计 具体变换可以自己根据需求变更 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!