【问题标题】:How to aggregate percentile_disc() function over date time如何在日期时间内聚合 percentile_disc() 函数
【发布时间】:2021-08-19 05:10:13
【问题描述】:

我有如下表格:

recorddate score 
2021-05-01   0
2021-05-01   1 
2021-05-01   2
2021-05-02   3
2021-05-02   4
2021-05-03   5
2021-05-07   6

并且希望每周获得score 的第 60 个百分位数。我试过了:

select distinct 
       recorddate
     , PERCENTILE_disc(0.60) WITHIN GROUP (ORDER BY score)
                             OVER (PARTITION BY recorddate) AS top60
from tbl;

它返回如下内容:

recorddate top60
2021-05-01  1
2021-05-02  4
2021-05-03  5
2021-05-07  6

但我想要的结果是每周汇总(7 天)。 例如在 2021-05-07 结束的那一周:

recorddate                    top60
2021-05-01 ~ 2021-05-07        2

有解决办法吗?

【问题讨论】:

  • “top60”应该是什么?为什么你的一周跨越 8 天?
  • 我编辑了关于一周的问题。 top60是累积排名。所以我想在一周内对分数进行排序并获得前 60% 的分数。谢谢
  • 海森堡。 . .我仍然不明白在这种情况下“累积排名”应该是什么意思。也许 Erwin Brandstetter 理解得更好。
  • @Gordon:更多的是有根据的猜测,真的。
  • @Heisenberg:我冒昧地进行了编辑并使其更清晰。我做对了吗?

标签: sql postgresql datetime aggregate-functions percentile


【解决方案1】:

我想你想要这个:

SELECT date_trunc('week', recorddate) AS week
     , percentile_disc(0.60) WITHIN GROUP(ORDER BY score) AS top60
FROM   tbl
GROUP  BY 1;

这是每周(存在实际数据)第 60 个百分位的离散值 - 同一组(一周内)中 60% 的行相同或更小。准确的说,用the manual的话来说:

有序的聚合参数值集中的第一个值,其在排序中的位置等于或超过指定的分数。

在上面添加你的格式:

SELECT to_char(week_start, 'YYYY-MM-DD" ~ "')
    || to_char(week_start + interval '6 days', 'YYYY-MM-DD') AS week
     , top60
FROM  (
   SELECT date_trunc('week', recorddate) AS week_start
        , percentile_disc(0.60) WITHIN GROUP(ORDER BY score) AS top60
   FROM   tbl
   GROUP  BY 1
   ) sub;

我宁愿称它为“percentile_60”。

【讨论】:

    猜你喜欢
    • 2017-06-05
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    • 2018-06-29
    • 2019-03-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-21
    相关资源
    最近更新 更多