-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 赔率,以及从最后一次更新中,给我每种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

但这不起作用,因为我总是会得到最新的赔率(而不是最新的最高/最好的赔率)

我希望我说得通。

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

您的“来自上次更新”的话与您的示例相矛盾。这里有两种方法。

要从上次更新中获取,如何获取最大 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 给出不同的结果,具体取决于选择的列以及列是否比 group by 子句中的多。

于 2012-06-04T22:58:26.777 回答