gpt4 book ai didi

sql - 对我的智力来说,太多的 order by, max, 子查询

转载 作者:行者123 更新时间:2023-11-29 12:00:57 25 4
gpt4 key购买 nike

我似乎无法解决这个问题。我确定它需要子查询,但我别无选择。我的大脑无法处理这个或其他东西。我需要帮助:)

小介绍

我有一个赔率网站。每隔 15 分钟,我就会从各个博彩公司导入特定赛事的最新赔率(赢/平/输 -- 或 1/X/2)。

赔率表的每一行都有odds_type('1'、'X'或'2'),odds_index是实际赔率,bookmaker_idevent_id

但同样重要的是:created_at,因为我需要处理来自最新导入 的可能性。由于显而易见的原因,它非常重要。

场景

在下表中,我们使用的是 event_id #1 的导入赔率。

需要查询

  1. 从所有博彩公司中分离出 event_id = 1 的最新导入赔率集(在此示例中为 9 条记录)
  2. 在该集合上,返回 odds_type“1”、“X”、“2”的最高 odds_index 记录。

现在我更喜欢使用 Rails 范围来做到这一点,所以我可以使用 @event.best_odds1@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

最佳答案

你可以使用 row_number() 两次:

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 这样的历史表,并将过时的 Odds 移到那里。当 Odds 表中只有最新的 Odds 时,您的查询将变得更加简单。

Live example at SQL Fiddle.

关于sql - 对我的智力来说,太多的 order by, max, 子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10985767/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com