sql - 基于Postgresql数据桶的分析

标签 sql postgresql

我有一个名为 work 的表,其中的列为:

CREATE TABLE work (user text, user_type text, medium text, 
docs_read int, on_date timestamp with timezone);

我想创建每天阅读的文档数量的桶(0-99、100-199 等),并计算 user_type 和 medium 的每种组合在几天内的平均、最小和最大生产率。

我可以使用 on_date 计算 docs_read 和分组的总和,以获得每天的 docs_read 数量:

SELECT on_date::date as day, sum(docs_read) as total_docs_read 
FROM work GROUP BY day;

现在,我必须将每天的 total_docs_read 分组到大小为 100 的桶中,并为每个桶计算每个 user_type 和媒介的平均、最小和最大生产力。

生产力 = 一天的 docs_read 总和/当天工作的用户数

基本上,我们有不同类型的用户,如教授、助理教授等阅读不同语言的文档,我们想知道他们每天每个用户阅读多少文档。因此,对于每个工作负载桶、每个用户类型和介质,我想获得一个桶内多天的平均每天平均生产率的最大值和最小值。

示例输出应该是:

docs_read_bucket   user_type   medium    avg_prod  max_prod  min_prod
0-99               A           English     30       50         15

最佳答案

让我们定义存储桶索引 0,1,2,3... 分别对应存储桶 '0-99'、'100-199'、'200-299'、'300-399'...。数学上 bucket_index = floor(total_docs_read/100)。

检查以下查询是否适合您。

解决方案摘要是 - 我们首先为每个用户类型和媒体每天的生产力创建一个表。我们每天为 total_docs_read 创建另一个表。然后,我们在 day 连接这两个表,并在 bucket_index、user_type 和 medium 上聚合结果表。

SELECT 
    bucket_index, user_type, medium, AVG(productivity) as avg_prod, 
    MAX(productivity) as max_prod, MIN(productivity) as min_prod
FROM
    (SELECT 
            floor(t1.total_docs_read/100) as bucket_index, 
            t2.user_type as user_type, t2.medium as medium, 
            t2.productivity as productivity
    FROM
        (SELECT 
            on_date::date as day, sum(docs_read) as total_docs_read 
        FROM work 
        GROUP BY day) as t1,
        (SELECT 
            on_date::date as day, user_type, medium, 
            sum(docs_read)/count(distinct(user)) as productivity
        FROM work
        GROUP BY day, user_type, medium) as t2
    WHERE t1.day=t2.day) as t3
GROUP BY bucket_index, user_type, medium

关于sql - 基于Postgresql数据桶的分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45592502/

相关文章:

postgresql - 计算postgresql中运行的长度

sql - jsonb @> 搜索的 PostgreSQL 索引

sql - 返回在 UPDATE 中实际更改的表的行

php - 将行分组为一行的学说和 SUM 数量不起作用

mysql - 在 HP ALM 的合并两个查询中需要帮助

sql - 如果没有返回行,则返回具有空值的行

postgresql - 戈尔姆 : upsert not inserting proper values

sql - 为什么计数结果与正常选择行计数不同?在极光 Postgresql 中

mysql - 连接表并进行计数操作 - MySQL

postgresql - 选择包含值的列上的所有行