我使用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中反映这种结构的正确方法是什么?我需要经常查询这些数据,因此性能是此解决方案的第一标准。
答案 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