我正在建立一个赛马数据库,并想知道是否有任何曲目比其他曲目更快/更慢。我不想仅仅比较每个赛道的平均赛车时间,因为有些赛道的经验较少且马匹较慢。为了避免这个错误,我想只使用在两个赛道上比赛的马匹来比较每个赛道。
到目前为止,我有包含
的表格位置,马,平均时间
我想创建一个视图,在第一列中包含每个位置的单个条目。然后我希望每个位置都有自己的列,其中包含仅在两个位置参加比赛的马的平均时间差异
例如我希望输出看起来像这样:
╔═══════════╦═════════╦═════════╦═══════════╗<无线电通信/>
║.......位置........║..... fleming ....║.... morphet ....║....... caulfield ... ......║
╠═══════════╬═════════╬═════════╬═══════════╣
║....... fle ..... ..... ..... ..... ..... ..................... 0.1 ........║...........- 0.2 ...........║
║....... morphet .......║......... 0.1 .........║........... 0。 .........║............ 0.3 ...........║
║....... caulfield ......║.......... 0.2 ........║.........- 0.3 ...... .....║............. 0 ............║
╚═══════════╩═════════╩═════════╩═══════════╝
< / p>
到目前为止我所拥有的是
选择位置,
(CASE h_adv
。location
什么时候出现&#39;那么h_adv
。AVG_TIME
END))AS fleming
,
(CASE h_adv
。location
当&#39; morphet&#39;那么h_adv
。AVG_TIME
END))AS morphet
,
(CASE h_adv
。location
当&#39; caulfield&#39;那么h_adv
。AVG_TIME
END))AS caulfield
,
但我不知道如何指定我只想使用在两个赛道上比赛的马匹的时间,并且我想找出这些平均值之间的差异。任何帮助,将不胜感激。抱歉格式化。提前谢谢。
答案 0 :(得分:0)
更多&#34; SQL&#34;这样做的方法是将数据放在行而不是列中。假设没有马在赛道上不止一次比赛:
select a1.location, a2.location, count(*) as num, avg(time)
from h_adv a1 join
h_adv a2
on a1.horse = a2.horse
group by a1.location, a2.location;
如果马匹不止一次在特定赛道上比赛,那么您需要通过赛马和赛道预先汇总数据。否则,您将获得一些笛卡尔积,这将导致平均值关闭:
select a1.location, a2.location, count(*) as num, sum(sumtime) / count(*) as avg
from (select location, horse, count(*) as numraces, sum(time) as sumtime
from h_adv
group by location, horse
) a1 join
(select location, horse, count(*) as numraces, sum(time) as sumtime
from h_adv
group by location, horse
) a2
on a1.horse = a2.horse
group by a1.location, a2.location;
SQL在聚合时间等方面往往很糟糕。如果将时间存储为数字,例如秒数,则可能是最好的。