PostgreSQL非重叠范围

时间:2016-03-28 11:48:43

标签: postgresql

我使用PostgreSQL数据库,并有一个cards表。

此表中的每条记录(卡片)都有card_drop_rate整数值。

例如:

id | card_name |card_drop_rate
-------------------------------
1  |card1      |34
2  |card2      |16
3  |card3      |54

最大丢弃率为34 + 16 + 54 = 104

根据我的应用程序逻辑,我需要找到0到104之间的随机值,然后根据这个数字检索卡片,例如:

随机值:71

card1 range: 0 - 34(0 + 34)
card2 range: 34 - 50(34 + 16)
card3 range: 50 - 104(50 + 54)

所以,我的卡是card3,因为71位于50 - 104

范围内

在PostgreSQL中反映这种结构的正确方法是什么?我需要经常查询这些数据,因此性能是此解决方案的第一标准。

2 个答案:

答案 0 :(得分:0)

您可以使用累积金额和随机来执行此操作。 “+ 1”可能会让我失望,但它是这样的:

Avaluo

为了提高性能,我只需要取出卡片并生成一个包含106个插槽的新表格。将卡值分配给插槽并在插槽号上建立索引。然后使用以下方法获取值:

with c as (
      select c.*,
             sum(card_drop_rate + 1) - card_drop_rate as threshhold
      from cards c
     ),
     r as (
      select random() * (sum(card_drop_rate) + count(*) - 1) as which_card
      from cards c
     )
select c.*
from c cross join
     r
where which_card >= threshhold
order by threshhold
limit 1;

答案 1 :(得分:0)

以下查询工作正常:

SELECT
b.id,
b.card_drop_rate
FROM (SELECT a.id, sum(a.card_drop_rate) OVER(ORDER BY id) - a.card_drop_rate as rate, card_drop_rate FROM cards as a) b
WHERE b.rate < 299 ORDER BY id DESC LIMIT 1