【问题标题】:SQL , Postgres: How to get percentile from non-normal distribution?SQL,Postgres:如何从非正态分布中获取百分位数?
【发布时间】:2020-11-13 13:03:16
【问题描述】:

我有一个 100 分的分布箱,每个箱都有基于评分模式的不同分布

现在我有一个表,其中包含主题 ID 和数组列,其中包含在各个分类中得分的学生人数,如下所示:

<26 <41 <61 <71 <81 <91 <101

4   15  11  14  18  19  28  

如何在 Postgres 中从这个分布中获得第 25、第 50、第 75 和第 95 个百分位数分数? 分布可能不正常。

是否可以在 timescaledb 中聚合它(实际上我需要把它放在哪里),因为它还不支持连续聚合?

【问题讨论】:

    标签: sql postgresql statistics timescaledb


    【解决方案1】:

    您可以通过这种方式对数据进行反透视并提取信息。当然,您没有足够的信息来真正重新生成原始数据。以下只是比 bin max 少一:

    select generate_series(1, num, 1) as n, v.val
    from t cross join lateral
         (values ("<26", 25), ("<41", 40), . . .  ) v(num, val);
    

    然后就可以在这个上面运行函数了,比如:

    select percentile_cont(0.5) within group (order by val)
    from (select generate_series(1, num, 1) as n, v.val
          from t cross join lateral
               (values ("<26", 25), ("<41", 40), . . .  ) v(num, val)
         ) gs;
    

    使用学生级别的原始数据会更好。我想你已经知道了。

    【讨论】:

    • 太棒了,解释也很有帮助。谢谢!关于学生数据,它有数百万行。我在 pandas 中对其进行一级聚合,然后数据可用,如上所示。
    • @aashetic 。 . .你有倒退的过程。将详细数据存储在数据库中。在另一个工具中对汇总数据进行复杂的统计和可视化处理。
    猜你喜欢
    • 2021-05-05
    • 1970-01-01
    • 2015-02-14
    • 2015-03-09
    • 2020-04-28
    • 2011-11-15
    • 2021-11-02
    • 2017-08-31
    • 2022-01-22
    相关资源
    最近更新 更多