gpt4 book ai didi

php - 如何计算不同时间跨度内总分的百分位排名?

转载 作者:可可西里 更新时间:2023-11-01 08:38:27 27 4
gpt4 key购买 nike

在基于 PHP 和 CodeIgniter 的网站上,用户可以通过各种操作赢得声誉,这与 Stack Overflow 没有什么不同。每次授予声誉时,都会在 MySQL 表中创建一个新条目,其中包含 user_id、被奖励的操作以及那一堆点的值(例如 10 个声誉)。同时,更新 users 表中的字段 reputation_total

由于没有引用框架,所有这些都毫无意义,我想向用户展示他们在所有用户中的百分位排名。对于总体声誉,这似乎很容易。假设我的 user_id1138。只需统计 users 表中 reputation_total 小于我的用户数,统计用户总数,然后除以找到信誉较低的用户的百分比比我的。那将是用户 1138 的百分位排名,对吗?简单!

但我也会显示不同时间跨度的声望总计——例如,过去 7 天获得的声望,这涉及查询声望表并汇总自给定日期以来我获得的所有积分。我还想显示不同时间跨度的百分位排名——例如,我可能总体排名第 11 个百分位,但本月排名第 50 个百分位,今天排名第 97 个百分位。

看来我必须遍历并找到给定时间跨度内所有用户的声誉总计,然后看看我在该组中的位置,不是吗?那不是很麻烦吗?执行此操作的最佳方法是什么?

非常感谢。

最佳答案

在这里我可以想到几个选项:

  1. 如您所述,将时间范围内获得的声望点加起来,并据此计算百分位排名。

  2. 每天跟踪 reputation_total 的更新 - 因此您有一个包含 user_id、日期、reputation_total 的表。

  3. 为每个时间范围向用户表添加一些新列(reputation_total、reputation_total_today、reputation_total_last30days 等)。您还可以将其规范化为一个单独的表 (reputation_totals),以防止您必须为每个要跟踪的时间跨度添加一个新列。

选项 #1 是最简单的,但如果您的声誉交易表中有很多行,它可能会变慢 - 它不会很好地扩展,特别是如果您需要实时计算这些。

随着时间的推移,选项 #2 将需要更多的存储空间(每个用户每天一行),但可能比直接查询事务表快得多。

选项 #3 不太灵活,但可能是最快的选项。

选项 2 和 3 都可能需要一个批处理过程来每天计算总计,因此这也是需要考虑的事情。

我不认为任何选项都一定是最好的 - 它们都涉及速度/存储空间/复杂性/灵 active 的不同权衡。当然,您的操作最终将取决于您的应用要求。

关于php - 如何计算不同时间跨度内总分的百分位排名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1007146/

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