数据库和任意百分比表?

时间:2009-10-13 15:22:38

标签: database-design db2

这个问题有点复杂,我甚至不知道谷歌是如何做到这一点的。我甚至有很多难以连贯地描述我的问题,但是这里有了!

大家好,我需要一些SQL的帮助。我正在为公司的企业培训软件制作数据库(DB2 Express-C)后端。

目的是将候选人的分数与“原始分数百分比值”匹配进行比较,例如

例如: 游戏我
确定的单词(原始分数) - 百分比值
10 - 0%
40 - 20%
60 - 50%
90-80%
200 - 100%

因此,例如,如果员工得分30个字,根据上面设定的值,他将被授予0% 如果另外得分91字,她将获得80% 而另一个得分300字,得分将是100%

如上面的示例所示,该系列值绝对不是线性的。因此,我需要一个能够存储原始分数(定量或定性)并与不同游戏的相应百分比值配对的表格。

我想到了一个方法如下(随意批评) 一个包含20列的数据库表(以5%的间隔命名为0-100%,即列号为0,5,10,15 ... 100),其中包含游戏ID列。然后我想我可以访问列序数并迭代,同时将值与每列进行比较。在遇到大于原始分数的值时,先前的列名称将被视为要授予的百分比。但是想一想,序数看起来非常低效/笨拙。

然后我想到的另一种方法是使用2列,一列用于游戏ID,另一列用作数组数据类型。将为每行定义20个元素的固定数组。然后,如果元素为NOT NULL,则将其用作比较的第一个基础。数组将前进,直到遇到大于候选人得分的值。因此,先前的NON NULL值将用作要分配的百分比。

然而,我对这种不太优雅的解决方案感到非常不满,我希望你有更好的解决方案。

非常感谢所有人,我非常感谢你阅读并帮助我。

我非常渴望学习,所以请批评我的方法和思考。

EDIT!: 我和善意的人之间似乎存在着误解。

我需要强调的是,单词的例子只是一个例子。还有许多其他游戏,如跳跃次数。点击次数等等。所以有一个双列表是没有用的因为我需要一个价值百分比对0到100%的游戏。

4 个答案:

答案 0 :(得分:1)

试试这个:

  • 创建一个名为scorelookup的表,其中包含两列,称为百分比和单词。此表必须使用原始分数填充百分比查找值
  • 我假设您有一个名为Score的表,其中包含所有相关数据(在下面的示例中由field1,field2和field3表示),以及一个名为rawscore的列,其中包含测试主题的单词原始分数。

然后我们只需要这个查询:

select field1, field2, field3,rawscore, (
    select max(percentage) from scorelookup where words < r.rawscore  ) rank
from scores r;

如果我理解你正确的话就应该这样做。

编辑(编辑后):

正如您的示例是一个示例,此示例就是一个示例。

  • 使用名为quiz
  • 的列扩展表scorelookup
  • 将表scorelookup中的列名单词改为可评分
  • 调整查询,假设为了这个例子,我们将查看一些名为Test2的分数

现在看起来应该是这样的:

select field1, field2, field3,raw, (
    select max(percentage) from scorelookup where scoreable < r.rawscore and quiz='Test2'  ) rank
from scores r;

好的,还有一些工作要做(毕竟这只是一个例子),但这应该让你开始。

答案 1 :(得分:0)

如果您创建一个包含您指定的两列的表,一个用于No Of Words,另一个用于得分,您可以像这样查询:

 select max(NoOfWords), Score from table
 where NoOfWords <= UserNumberOfWords

其中,用户数量的单词是用户识别的单词数。这样,您只需将结果重新调整为小于用户实际获得的单词数的分数,然后找到最大值。

答案 2 :(得分:0)

我认为你这里只需要2张桌子。第一个表有2列名为game_id,还有一个名为Game_Name的可选列或类似的列。第二个表有3列; game_id,得分和百分比。然后你只需从table2中选择百分比,其中game_id =你的游戏和得分&lt;你的分数。第一个表甚至不是必需的,因为您可以随意分配游戏ID,但查找表比任意数字分配更容易管理。

答案 3 :(得分:0)

此方法与查询的编写方式不同。表定义与此处的其他建议大致相似。

CREATE TABLE gameScoreThresholds (
game_id INTEGER NOT NULL,
raw_score SMALLINT NOT NULL,
score_percentage SMALLINT NOT NULL
)
;

CREATE UNIQUE INDEX gamescoreidx ON gameScoreThresholds(game_id, raw_score) CLUSTER
;

ALTER TABLE gameScoreThresholds ADD PRIMARY KEY (game_id, raw_score)
;

SELECT score_percentage FROM gameScoreThresholds 
WHERE game_id = ? AND raw_score <= ?
ORDER BY raw_score DESC 
FETCH FIRST ROW ONLY
;