用于排名项组的sqlite子查询

时间:2012-02-22 02:11:59

标签: sql sqlite

该表有三列(Group,Rank,Score),带有复合主键(Group,Rank)。每个小组至少有一个Rank为1的条目和一个分数。如果每个组有多个行,则其排名大于1且得分。例如:

+-------+------+-------+
| Group | Rank | Score |
+-------+------+-------+
|     1 |    1 |   100 |
|     1 |    2 |    99 |
|     1 |    3 |    80 |
|     2 |    1 |    70 |
|     2 |    2 |    68 |
|     2 |    3 |    50 |
|     2 |    4 |    20 |
|     3 |    1 |    80 |
+-------+------+-------+

我的目标是选择“接近”每个组的最高分的所有行,其中最高分被定义为每组1的Rank值得分。在上面的例子中,第1组的最高分为100,第2组的最高分为70,第3组的最高分为80.我们希望选择最多比最高分小5%的行。对于上面的示例,结果选择将返回:

+-------+------+-------+
| Group | Rank | Score |
+-------+------+-------+
|     1 |    1 |   100 |
|     1 |    2 |    99 |
|     2 |    1 |    70 |
|     2 |    2 |    68 |
|     3 |    1 |    80 |
+-------+------+-------+

我的第二个目标是将得分/ top_score的比率作为新列,这将消除上述目标。 提前致谢。对于SQLite。

1 个答案:

答案 0 :(得分:1)

未经测试,脱离了我的头顶。

SELECT s."Group"
  , s."Rank"
  , s."Score"
  , s."Score"/ts."Score" as "ScoreRatio"
FROM scores s
  JOIN (
      SELECT "Group", "Score"
      FROM scores
      WHERE "Rank" = 1
  ) ts
  ON s."Group" = ts."Group"
    AND 0.95 * ts."Score" <= s."Score"