这个问题有点复杂,我甚至不知道谷歌是如何做到这一点的。我甚至有很多难以连贯地描述我的问题,但是这里有了!
大家好,我需要一些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%的游戏。
答案 0 :(得分:1)
试试这个:
然后我们只需要这个查询:
select field1, field2, field3,rawscore, (
select max(percentage) from scorelookup where words < r.rawscore ) rank
from scores r;
如果我理解你正确的话就应该这样做。
编辑(编辑后):
正如您的示例是一个示例,此示例就是一个示例。
现在看起来应该是这样的:
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
;