0

以下に示すように、2 つのテーブルがあり、1 つの SQL クエリで参加者の時間 (finish_time - start_time) を取得しようとしています。開始時刻と終了時刻は、race_events という関連テーブルの occured_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) も計算したいので、結果は上記のようになりますが、その行の (finished_at - started_at) の結果を含む race_time という追加の列があります。誰かが私がそれを行う方法を提案できますか?

これに関連して、サブクエリを使用して関連する値を取得する一般的なアプローチが最もクリーンで効率的であるとは確信していません。他の提案をいただければ幸いです。

私は PostgreSQL を使用していますが、答えはどの SQL データベースでも同じだと思います。

前もって感謝します。

4

3 に答える 3

1

race_events に 2 回参加する必要があります

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
于 2013-04-20T19:52:56.573 に答える
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'
于 2013-04-20T19:56:14.543 に答える
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 テーブルと race_events テーブルの race_id 列の両方が欠落していると思います。

于 2013-04-20T20:19:08.927 に答える