我在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
但这不起作用,因为我总能获得最新的赔率(而不是最新的赔率)
我希望我有意义。
答案 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会给出不同的结果。