我有兩個表,如下所示,我試圖在一個SQL查詢中獲取參與者的時間(finish_time - start_time)。請注意,開始時間和結束時間需要從名爲race_events的關聯表的occurrence_at列中檢索。SQL檢索並執行關聯表的值算術
PARTICIPANTS
id | membership_id | race_id
------+---------------+---------
1133 | 547 | 690
1121 | 342 | 690
RACE_EVENTS
id | participant_id | event_type | occurred_at
------+----------------+------------+---------------
1075 | 1121 | start | 1366249860579
1077 | 1121 | finish | 1366249968936
1104 | 1133 | start | 1366250760128
1107 | 1133 | finish | 1366250876237
我無法弄清楚如何實現這一目標使用連接,因此我解決了使用子查詢,像這樣的問題:
SELECT
(select occurred_at from race_events where participant_id = participants.id and event_type = 'start') as started_at,
(select occurred_at from race_events where participant_id = participants.id and event_type = 'finish') as finished_at,
participants.* FROM "participants"
這引起了我的大部分有yeilding包含啓動結果的方式和結束時間爲每個參與者:
started_at | finished_at | id | membership_id | race_id
---------------+---------------+------+---------------+---------
1366250760128 | 1366250876237 | 1133 | 547 | 690
1366249860579 | 1366249968936 | 1121 | 342 | 690
理想的情況下,雖然我想也計算race_time(finished_at - started_at)在此查詢過,所以結果看起來像但是有一個名爲race_time的額外列,其中包含該行的(finished_at - started_at)的結果。任何人都可以建議我怎麼做?
在相關說明中,我不相信使用子查詢來獲取關聯值的一般方法是最乾淨或最有效的,我非常感謝其他建議。
我使用的是PostgreSQL,但我懷疑答案對任何SQL數據庫都是一樣的。
在此先感謝。
你爲什麼要這樣處理比賽?開始和結束應該在同一記錄中。完成時更新它。 – Yatrix 2013-04-20 20:02:01
我知道你的意思。在我們的案例中,「開始」和「完成」不是我們必須處理的唯一競賽事件,不同類型的比賽有不同類型的事件,如轉換和拆分。我們不太確定未來將需要什麼類型的事件,這就是我爲什麼這樣做的原因。 – Bruce 2013-04-20 20:24:10