如何在日期时间内聚合 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() 函数的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Eloquent 的日期时间列的时间上使用聚合函数?
Clickhouse - 如何按日期在数组中聚合超出此日期的数据?
Doctrine Mongodb ODM 在聚合中添加动态日期