如何在日期时间内聚合 percentile_disc() 函数

Posted

技术标签:

【中文标题】如何在日期时间内聚合 percentile_disc() 函数【英文标题】:How to aggregate percentile_disc() function over date time 【发布时间】: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:我冒昧地进行了编辑并使其更清晰。我做对了吗? 【参考方案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”。

【讨论】:

以上是关于如何在日期时间内聚合 percentile_disc() 函数的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 在日期范围内聚合

如何在 Eloquent 的日期时间列的时间上使用聚合函数?

Clickhouse - 如何按日期在数组中聚合超出此日期的数据?

Doctrine Mongodb ODM 在聚合中添加动态日期

如何在 C# Nest 中将日期值发送到 elasticsearch 聚合查询

如何根据 R 中的日期聚合数据?