gpt4 book ai didi

sql - 将表 PK 值拆分为大致相同大小的范围

转载 作者:行者123 更新时间:2023-11-29 13:21:01 24 4
gpt4 key购买 nike

我在 Postgres 中有一个表,其中包含大约一百万行和一个整数主键。

我想把它的整个PK空间拆分成N个大小差不多相同的区间独立处理。我该如何最好地做到这一点?

我显然可以通过将所有 PK 值获取到客户端并记住每个第 N 个值来做到这一点。这会进行全面扫描并获取所有值,而我只需要不超过 N+1 个值。

我可以选择最小值和最大值并缩小范围,但如果 PK 分布不均匀,它可能会给我一些大小非常不同的范围。

稍后我想要基于索引的访问范围,因此任何基于模数的技巧都不适用。

是否有任何不错的基于 SQL 的解决方案不涉及将所有 key 提取到客户端?编写一个特定于 N 的查询,例如有 N 个子句,如果可以的话。

一个例子:

范围内的 ID,例如,从 1234 到 567890,N = 4。

我想得到 4 个数字,比如 127123、254789、379860,所以在 ID [1234、127123]、[127123、254789] 的每个范围内大约 125k 条记录], [254789, 379860], [379860, 567890].

更新:

我想出了这样的解决方案:

select 
percentile_disc(0.25) within group (order by c.id) over() as pct_25
,percentile_disc(0.50) within group (order by c.id) over() as pct_50
,percentile_disc(0.75) within group (order by c.id) over() as pct_75
from customer c
limit 1
;

它在为我提供准确的范围边界方面做得不错,并且只运行了几秒钟,这对我来说很好。

令我困扰的是,我必须添加 limit 1 子句才能获得一行。没有它,我会收到相同的行,表中的每条记录一个。有没有更好的方法来获取一行百分位数?

最佳答案

我想您可以使用 row_number() 来达到这个目的。像这样:

select t.*,
floor((seqnum * N) / cnt) as range
from (select t.*,
row_number() over (order by pk) - 1 as seqnum,
count(*) over () as cnt
from t
) t;

这假设范围是指 pk 值的范围。您还可以将范围表达式移动到 where 子句以仅选择一个特定范围。

关于sql - 将表 PK 值拆分为大致相同大小的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41768209/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com