查找值的平均值,在列索引出现不止一次的条件下(mySQL))

时间:2014-12-22 16:10:17

标签: mysql average

我正在建立一个赛马数据库,并想知道是否有任何曲目比其他曲目更快/更慢。我不想仅仅比较每个赛道的平均赛车时间,因为有些赛道的经验较少且马匹较慢。为了避免这个错误,我想只使用在两个赛道上比赛的马匹来比较每个赛道。

到目前为止,我有包含

的表格

位置,马,平均时间

我想创建一个视图,在第一列中包含每个位置的单个条目。然后我希望每个位置都有自己的列,其中包含仅在两个位置参加比赛的马的平均时间差异

例如我希望输出看起来像这样:

╔═══════════╦═════════╦═════════╦═══════════╗<无线电通信/> ║.......位置........║..... fleming ....║.... morphet ....║....... caulfield ... ......║
╠═══════════╬═════════╬═════════╬═══════════╣
║....... fle ..... ..... ..... ..... ..... ..................... 0.1 ........║...........- 0.2 ...........║
║....... morphet .......║......... 0.1 .........║........... 0。 .........║............ 0.3 ...........║
║....... caulfield ......║.......... 0.2 ........║.........- 0.3 ...... .....║............. 0 ............║
╚═══════════╩═════════╩═════════╩═══════════╝
< / p>

到目前为止我所拥有的是

选择位置,
(CASE h_advlocation             什么时候出现&#39;那么h_advAVG_TIME         END))AS fleming
(CASE h_advlocation             当&#39; morphet&#39;那么h_advAVG_TIME         END))AS morphet
(CASE h_advlocation             当&#39; caulfield&#39;那么h_advAVG_TIME         END))AS caulfield


但我不知道如何指定我只想使用在两个赛道上比赛的马匹的时间,并且我想找出这些平均值之间的差异。任何帮助,将不胜感激。抱歉格式化。提前谢谢。

1 个答案:

答案 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在聚合时间等方面往往很糟糕。如果将时间存储为数字,例如秒数,则可能是最好的。