【问题标题】:Query to populate a leaderboard with entry conditions查询以使用进入条件填充排行榜
【发布时间】:2023-03-25 08:18:01
【问题描述】:

我有 3 张桌子:

PLAYER        (NAME)
ALL_GOALS     (TYPE, GROUP        , POINTS)
GOALS_REACHED (TYPE, EARNED_POINTS, PLAYER_NAME)

我需要编写一个查询来提供排行榜。

当且仅当玩家通过GROUP='IMPORTANT'达到至少一个目标时,他才能进入排行榜。

例如:

 +--------------+
 | PLAYER       |
 +--------------+
 | John         |
 | Bill         |
 | Bob          |
 | Willy        |
 +--------------+

 +-------------------+
 | ALL_GOALS         |
 +-------------------+
 | A, IMPORTANT, 100 |
 | B, IMPORTANT, 200 |
 | C, OTHER, 10      |
 | D, OTHER, 10      |
 +-------------------+

 +--------------+
 | GOALS_REACHED|
 +--------------+
 | A, 100, John |
 | B, 200, Willy|
 | C, 10, Bob   |
 | D, 10, Bob   |
 +--------------+

我希望在我的排行榜中只看到 John 和 Willy

【问题讨论】:

  • GOALS_REACHED 表中的点与 ALL_GOALS 表中的点是否相同?如果是,那么为什么需要在 GOALS_REACHED 表中重复它们?这是一个糟糕的数据模型,只会产生问题。
  • 如果约翰实现了不止一个目标(甚至可能不止一个重要目标)怎么办?你需要给他看多次吗?那么——你为什么要关心积分呢? “排行榜”不取决于获得的总积分或类似的东西吗?你的问题中没有提到它。请澄清。
  • 嗨@mathguy,GOALS_REACHED 中的点可能不同,因为ALL_GOALS 在其生命周期中可能会发生变化,而我的老板不想追踪这些变化。那么目标 A 第 1 天可以有 100 分,第 100 天可以有 50 分。

标签: sql database oracle


【解决方案1】:

这样的? (示例数据在第 1 - 13 行;查询从第 14 行开始)

SQL> with
  2  all_goals (type, cgroup, points) as
  3    (select 'A', 'IMPORTANT', 100 from dual union all
  4     select 'B', 'IMPORTANT', 200 from dual union all
  5     select 'C', 'OTHER'    ,  10 from dual union all
  6     select 'D', 'OTHER'    ,  10 from dual
  7    ),
  8  goals_reached (type, earned_points, player_name) as
  9    (select 'A', 100, 'John'  from dual union all
 10     select 'B', 200, 'Willy' from dual union all
 11     select 'C',  10, 'Bob'   from dual union all
 12     select 'D',  10, 'Bob'   from dual
 13    )
 14  select r.player_name
 15  from goals_reached r join all_goals g on g.type = r.type
 16  where g.cgroup = 'IMPORTANT'
 17    and g.points > 0;

PLAYE
-----
John
Willy

SQL>

【讨论】:

  • 我们是否期望会有“重要”的目标获得 0 分?此外,您的查询中似乎没有聚合。如果约翰实现了五个目标,其中三个很重要,他将在输出中出现 3 次;可能不是 OP 的要求。
  • 不知道,@mathguy。我所知道的是 OP 发布的内容,以及他发布的示例数据。您的评论中有很多“如果”,不幸的是,我对其中任何一个都没有答案。你应该问 OP。
  • 我的意思是 - 你没有同样的问题吗? (如果不是,为什么不呢?)如果你这样做了,为什么不先问 OP,而不是根据可能正确或可能不正确且答案中未说明的假设发布答案?
  • 而且,特别是关于“points > 0”条件,这不是基于 OP 所说或显示的任何内容。在他的问题中没有提到,在他的样本数据中,所有的“点”都已经是积极的了。
  • 嗨@Littlefoot,非常感谢,我会尽快尝试您的解决方案
【解决方案2】:

感谢@Littlefoot 的回答和@mathguy 有用的cmets,我改进了查询并基于它创建了一个视图。这个看起来最像一个无序的排行榜。

select gr1.PLAYER_NAME, sum(gr1.EARNED_POINTS)
from GOALS_REACHED gr1
where exists(
  select *
  from GOALS_REACHED gr2
       inner join ALL_GOALS ag
       on gr2.TYPE=ag.TYPE
  where ag.GROUP='IMPORTANT' 
        and gr1.PLAYER_NAME=gr2.PLAYER_NAME
)
group by gr1.PLAYER_NAME

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-26
    • 1970-01-01
    • 2020-12-22
    • 2013-04-12
    • 1970-01-01
    • 2021-05-27
    • 1970-01-01
    • 2020-07-11
    相关资源
    最近更新 更多