2014-12-22 35 views
2

我正在構建一個賽馬數據庫,並且想要查找是否有任何曲目比其他曲目更快/更慢。我不想僅比較每條賽道的平均賽車時間,因爲有些賽道包含較低比率的經驗較少和速度較慢的賽馬。爲了避免這個錯誤,我想比較每條賽道,只使用在兩條賽道上都跑過的馬匹。查找值的平均值,在列索引出現多次(mySQL)的條件下)

到目前爲止,我有表,其中包含

位置,馬,平均時間

我想創建一個視圖,第一列包含每個位置都有一個條目。然後我希望每個位置都有自己的專欄,其中包含僅在兩個位置都跑過的唯一馬匹的平均時間差異

例如,我希望輸出看起來像這樣:

╔═════════════════════════════════════════════════════════════════════ ║.......位置........║..... fleming ....║.... morphet .... .. ....... caulfield ... ...║
╠══════════════════════════════════════════════════════ ╣
fle ............ fleming ........║.......... 0 ...........║........ -0.1 ........║...........- 0.2 ...........║
║....... morphet ... ....║......... ......... 0.1║........... 0 ..........║.. .......... 0.3 ...........║
║....... caulfield ......║......... .0.2 ........║.........- 0.3 ........║............. 0 ..... .......║
╚════════════════════════════════════════ ════╝


到目前爲止,我有什麼是

小號ELECT位置,
(CASE h_advlocation 當'fleming'然後h_advAVG_TIME END))AS fleming
(CASE h_advlocation WHEN 'morphet' THEN h_advAVG_TIME END))AS morphet
(CASE h_advlocation WHEN 'Caulfield的' THEN h_advAVG_TIME END) )AS caulfield


但我不知道如何指定,我只想使用的時間在兩條賽道上都參加過比賽的馬匹,我想找出這些平均值之間的差異。任何幫助,將不勝感激。對不起,格式化。提前致謝。

回答

0

這樣做的更多「SQL」方法是將數據放在行而不是列中。假設沒有馬已經在軌道不止一次跑到:

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往往是不好的事情一樣聚集的時間。如果您將時間存儲爲數字,例如秒數,則可能是最佳選擇。

+0

啊好吧我現在正在取得一些進展。是的每個位置和馬只有一個入口,因爲我已經找到了每個位置的平均值。時間也已經存儲爲使用雙精度值的秒數。謝謝你的幫助。 – MA2012