SQL检索并对关联表中的值执行算术运算

时间:2013-04-20 19:34:43

标签: sql postgresql subquery

我有两个表,如下所示,我试图在一个SQL查询中获取参与者的时间(finish_time - start_time)。请注意,需要从名为race_events的关联表的happe_at列中检索开始时间和结束时间。

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"

这让我大部分时间都在为每个参与者提供包含开始和结束时间的结果:

  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数据库的答案都是一样的。

提前致谢。

3 个答案:

答案 0 :(得分:1)

您需要两次加入race_events

select somefields, finished.occurred_at - started.occurred_at duration
from participants p join race_events started on p.race_id = started.race_id
and event_type = 'start'
join race_events finished on p.race_id = started.race_id
and event_type = 'finish'
where whatever

答案 1 :(得分:1)

试试这个,但请注意我没有尝试过它可能会有一些语法错误,但你应该明白这一点

SELECT 
    re1.occured_at as started_at, 
    re2.occured_at as finished_at,
    (re2.occured_at - re1.occured_at) as race_time,
    p.id,
    p.membership_id,
    p.race_id

participant_id FROM PARTICIPANTS p 
INNER JOIN RACE_EVENTS re1 ON re1.participant_id = p.id AND re1.event_type = 'start'
INNER JOIN RACE_EVENTS re2 ON re2.participant_id = p.id AND re2.event_type = 'finish'

答案 2 :(得分:0)

select
    started_at, finished_at,
    finished_at - started_at race_time,
    p.id, p.membership_id, p.race_id
from
    participants p
    inner join
    race_events res on p.id = res.participant_id
    inner join
    race_events ref on p.id = ref.participant_id
where
    res.event_type = 'start'
    and ref.event_type = 'finish'

我认为你的模型并不好,你在race_events表中缺少一个竞赛表和一个race_id列。