从上次更新获得最高赔率

时间:2012-06-04 21:31:40

标签: sql postgresql

我在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赔率,并从最后一次更新中,给我 最高赔率 >每个odds_type ('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

但这不起作用,因为我总能获得最新的赔率(而不是最新的赔率)

我希望我有意义。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

你的话“从上次更新”与你的例子相矛盾。这有两种方法。

要从上次更新中获取,请如何获取max 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)

注意:根据选择列以及是否有比group by子句更多的列,不同的DBMS会给出不同的结果。