2

我似乎无法解决这个查询。我确定它需要子查询,但我没有选择。我的大脑无法处理这个什么的。我需要帮助 :)

小介绍

我有一个投注赔率网站。每隔 15 分钟,我会导入来自不同博彩公司的特定赛事的最新赔率(赢/平/输 - 或 1/X/2)。

赔率表的每一行都有odds_type('1', 'X' 或 '2'),odds_index即实际赔率,bookmaker_idevent_id

但同样重要的是:created_at因为我需要处理最新导入的赔率。由于显而易见的原因,这非常重要。

设想

在下表中,我们正在使用event_id#1 的进口赔率。

需要查询

  1. 从所有博彩公司中分离出最新的输入赔率event_id= 1(在本例中为 9 条记录)
  2. 在该集合中,返回“1”、“X”、“2”的最高odds_index记录。odds_type

现在我更喜欢使用 Rails 范围来做到这一点,所以我可以使用@event.best_odds1and @event.best_odds2,但如果它有效,我会采取任何方法。5天以来一直在为此绞尽脑汁。需要解决它。

结果

查询后我得到 3 条记录,因此我可以显示“事件 #1 的最佳赔率”。

桌子

博彩公司

 ID  |  NAME
 ----------------------
 1   |  Unibet
 2   |  888
 3   |  Ladbrokes

活动

 ID  |  NAME
 --------------------------
 1   |  Holland vs Denmark
 2   |  England vs Germany
 3   |  France vs Spain

赔率

 ID  |  OT  |  OI  |  BI  |  EI  |  CREATED_AT
 ---------------------------------------------------
 (first import from the bookies)
 1   |  '1'  |  2.4  |  1  |  1  |  2010-06-10 15:00
 2   |  'X'  |  1.5  |  1  |  1  |  2010-06-10 15:00
 3   |  '2'  |  6.2  |  1  |  1  |  2010-06-10 15:00
 4   |  '1'  |  2.2  |  2  |  1  |  2010-06-10 15:58
 5   |  'X'  |  1.8  |  2  |  1  |  2010-06-10 15:58
 6   |  '2'  |  5.2  |  2  |  1  |  2010-06-10 15:58
 7   |  '1'  |  2.8  |  3  |  1  |  2010-06-10 16:56
 8   |  'X'  |  1.3  |  3  |  1  |  2010-06-10 16:56
 9   |  '2'  |  7.1  |  3  |  1  |  2010-06-10 16:56
 (last import from the bookies)
 10  |  '1'  |  2.5  |  1  |  1  |  2010-06-11 17:10
 11  |  'X'  |  1.3  |  1  |  1  |  2010-06-11 17:10
 12  |  '2'  |  6.4  |  1  |  1  |  2010-06-11 17:10
 13  |  '1'  |  2.1  |  2  |  1  |  2010-06-11 18.12
 14  |  'X'  |  1.2  |  2  |  1  |  2010-06-11 18:58
 15  |  '2'  |  6.2  |  2  |  1  |  2010-06-11 18:58
 16  |  '1'  |  1.8  |  3  |  1  |  2010-06-12 14:56
 17  |  'X'  |  2.3  |  3  |  1  |  2010-06-12 14:56
 18  |  '2'  |  5.1  |  3  |  1  |  2010-06-12 14:56

缩写列名以适应屏幕

OT = odds_type
OI = odds_index 
BI = bookmaker_id 
EI = event_id
4

1 回答 1

4

你可以使用row_number()两次:

select  *
from    (
        select  *
        ,       row_number() over (partition by OT order by OI desc) as rn2
        from    (
                select  *
                ,       row_number() over (partition by EI, BI, OT 
                                           order by created_at desc) as rn1
                from    Odds
                where   EI = 1 -- for event 1
                ) sub1
        where   rn1 = 1 -- Latest row per EI, BI, OT
        ) sub2
where   rn2 = 1 -- Highest OI per OT

但是如果表继续增长,这将表现得很糟糕。您可以添加像 OddsHistory 这样的历史表,并将过时的 Odds 移到那里。当 Odds 表中只有最新的 Odds 时,您的查询会变得更加简单。

SQL Fiddle 上的实时示例。

于 2012-06-11T18:47:32.150 回答