2

このクエリを解決できないようです。サブクエリが必要だと確信していますが、選択肢がありません。私の脳はこれか何かを処理できません。私は助けが必要です :)

少し紹介

私は賭けオッズのウェブサイトを持っています。15 分ごとに、さまざまなブックメーカーから特定のイベントの最新のオッズ (勝ち/引き分け/負け、または 1/X/2) をインポートします。

オッズ テーブルのすべての行にはodds_type('1'、'X' または '2') があり、odds_indexこれは実際のオッズであり、bookmaker_idevent_idです。

しかし、同様に重要なのは、最新のインポートcreated_atからのオッズで作業する必要があるためです。明白な理由から非常に重要です。

シナリオ

以下の表では、event_id#1 のインポートされたオッズを使用しています。

必要なクエリ

  1. = 1のインポートされたオッズの最新セットをevent_idすべてのブックメーカーから分離します (この例では 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()2回使用できます:

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 のような履歴テーブルを追加して、古いオッズをそこに移動できます。最新のオッズのみがオッズ テーブルにある場合、クエリははるかに簡単になります。

SQL Fiddle での実例。

于 2012-06-11T18:47:32.150 に答える