-1

PostgreSQL データベースに次のテーブルがあります。

ブックメーカー

-----------------------
| id   | name         |
-----------------------
| 1    | Unibet       |
-----------------------
| 2    | 888          |
-----------------------

オッズ

---------------------------------------------------------------------
| id  | odds_type  | odds_index  | bookmaker_id | created_at        |
---------------------------------------------------------------------
| 1   | 1          | 1.55        | 1            | 2012-06-02 10:30  |
---------------------------------------------------------------------
| 2   | 2          | 3.22        | 2            | 2012-06-02 10:30  |
---------------------------------------------------------------------
| 3   | X          | 3.00        | 1            | 2012-06-02 10:30  |
---------------------------------------------------------------------
| 4   | 2          | 1.25        | 1            | 2012-05-27 09:30  |
---------------------------------------------------------------------
| 5   | 1          | 2.30        | 2            | 2012-05-27 09:30  |
---------------------------------------------------------------------
| 6   | X          | 2.00        | 2            | 2012-05-27 09:30  |
---------------------------------------------------------------------

私がクエリしようとしているのは次のとおりです。

すべてのブックメーカーからの最新の更新(created_at) からの 1/X/2 オッズと、その最後の更新からのオッズ タイプ('1'、'2'、'X') の最高オッズを教えてください。

私のウェブサイトでは、次のように表示しています。

Best odds right now:   1   |   X   |   2
                     --------------------
                     2.30  |  3.00 | 3.22

昨日の更新のオッズは無効になっているので、まず最新のものを取得する必要があります。次に、前回の更新から、この場合は 2 つの異なるブックメーカーから 2 つのオッズがあるので、タイプ '1'、'2'、'X' に最適なものを取得する必要があります。

擬似 SQL は次のようになります。

SELECT MAX(odds_index) WHERE odds_type = '1' ORDER BY created_at DESC, odds_index DESC

しかし、それはうまくいきません。なぜなら、私は常に最新のオッズを取得するからです (そして、それらの最新の最高/最高ではありません)。

私が理にかなっていることを願っています。

4

2 に答える 2

2

救助へのサブクエリ!

select o1.odds_type, max(o1.odds_index)
from odds o1
inner join (select odds_type, max(created_at) as created_at
            from odds group by odds_type) o2
on o1.odds_type = o2.odds_type
and o1.created_at = o2.created_at
group by o1.odds_type

SQLFiddle: http://sqlfiddle.com/#!3/47df4/3

于 2012-06-04T21:37:52.033 に答える
0

「前回の更新から」というあなたの言葉は、あなたの例と矛盾しています。2 つの方法を次に示します。

最後の更新から取得するには、最大の created_at 日付、つまり最後の更新を取得し、それを残りに使用するのはどうですか。

declare @max_date date
select @max_date = max(created_at) from odds
select odds_type, odds_index
from odds
where created_at = @max_date

またはあなたの例に合わせて

select odds_type, odds_index
from odds
group by odds_type
having created_at = max(created_at)

注: DBMS が異なれば、select 列と、group by 句よりも多くの列があるかどうかによって、異なる結果が得られます。

于 2012-06-04T22:58:26.777 に答える