【问题标题】:How to create an Pareto output for a sum function?如何为求和函数创建帕累托输出?
【发布时间】:2021-01-25 22:40:37
【问题描述】:

我有一个更大的数据库表,其中一列 (bigint) 以字节为单位托管文件大小。此表中有大约 7500 万行。

现在我喜欢生成类似 Pareto 的聚合,将文件大小步骤作为类别。 输出应有 4 个计算列:

  1. 文件大小范围
  2. 计算:计数
  3. 计算:占总数的百分比
  4. 计算:文件大小的总和
  5. 计算:占总文件大小的百分比

示例: 第 1 行:500kB,45678 个文件,0.03%(占所有文件),124548 字节,占总文件大小的 0.0003% 第 3 行:500kB-> 1MB,... 第 4 行:... 第 n 行:>100GB,24 个文件,0,0001%(占所有文件),32425634232223654535 字节,占总文件大小的 5.432%

如果有意义,可以在单独的 SQL 表中提供分组(以字节为单位)。 到目前为止,我已经尝试单独查询所有这些行(选择 sum(filesize) where filesize > xyz),并在 Excel 中进行了最终计算等。但这似乎很奇怪。

在 PostgreSQL 中执行此操作的正确方法是什么?

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    demo:db<>fiddle

    SELECT 
        CASE                                                       -- 2
            WHEN filesize < 100 THEN '< 100'
            WHEN filesize BETWEEN 100 AND 1000 THEN '100 - 1000'
            WHEN filesize > 1000 THEN '> 1000'
        END,
        COUNT(*) as cnt_files,
        COUNT(*) / (s.cnt) as percentage_files,                    -- 4
        SUM(filesize) as total_data,
        SUM(filesize) / (s.total) as percentage_data
    FROM f
    CROSS JOIN (
        SELECT
            COUNT(*)::numeric as cnt,
            SUM(filesize)::numeric as total                        -- 1
        FROM f
    ) s
    GROUP BY 1, s.cnt, s.total                                     -- 3
    
    1. 计算总值(整个数据大小,所有文件的数量)
    2. 创建数据组
    3. GROUP BY您最近创建的群组
    4. 汇总每个组的数据,并在必要时使用总值创建百分比。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多