admin

我的智力最多只能按子查询排序

sql

我似乎无法解决此查询。我确定它需要子查询,但是我没有选择。我的大脑无法应付这些。我需要帮助 :)

小介绍

我有一个赔率网站。每隔15分钟,我会从各庄家那里输入特定事件的最新赔率(赢/平/输-或1 / X / 2)。

赔率表的每一行都有odds_type(‘1’,’X’或‘2’),odds_index这是实际赔率,bookmaker_id和和event_id

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

设想

在下表中,我们正在处理event_id#1的导入赔率。

需要查询

  1. event_id从所有庄家中分离出最新的= 1组进口赔率(在此示例中为9条记录)
  2. 在该集合上,返回最高odds_index记录odds_type“ 1”,“ X”,“ 2”。

现在,我更喜欢在Rails范围内执行此操作,因此我可以使用@event.best_odds1@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

阅读 225

收藏
2021-06-07

共1个答案

admin

您可以使用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移动到该表中。当赔率表中只有最新的赔率时,您的查询将变得更加简单。

SQL Fiddle的实时示例。

2021-06-07