-1

私はこれを知っている必要があります-しかし、私は知りません.誰かが構文を手伝ってくれますか.

クロスカントリー リレー レースでランナーを追跡しているとしましょう。ランナーをレースに関連付けるメインの結合テーブルと、ランナーがいつどこで、いつ、どこで、いつ足をスタートしたかを示すランナー テーブルがあります。終了しました...ルートに沿って記録されたチェックポイントもあります。

各ランナーには開始点と終了点が必要です - ただし、これは常に正しく入力されているとは限りません* - レースに両方のタイプのエントリを持っていないランナーを抽出するクエリが必要です.

(*はい、データ入力側を修正しています)

どうも

構造:

RACE TABLE 
 raceID (int)
 runnerID (int)

STOPS TABLE
 runnerID (int)
 stopTypeID (int)  -- fk to stop type
 when (timestamp)
 sequence (smallint)

私はまだ何も「持っていません」 - 必要なものに困惑しているので...

ランナーとレースログを取得するための基本的なQはこれです

SELECT *
FROM RACES R
JOIN STOPS S ON S.runnerID = R.runnerID
WHERE R.RaceID = 133



RESULTS
1 = start 
2 = check point
3 = rest point
4 = end

RACEID  RUNNERID    STOPTYPEID
133     21      1 
133     21      4
133     21      3
133     21      2
133     21      2
133     21      2
133     21      2
133     21      2
133     23      2
133     23      2
133     23      2
133     23      2
133     23      4

ランナー 23 にタイプ '1' (開始) が欠落していることに注意してください データが欠落しているレースのランナーのリストが必要です... 1 と 4 が必要であると言うと....

(thx、必要な「データ」を投稿しなかったことをお詫びします)

4

3 に答える 3

1

あなたの構造については少し推測しますが、

SELECT RR.RunnerId
FROM Race AS R
INNER JOIN RaceRunners AS RR
  ON <whatever>
LEFT OUTER JOIN Runners AS Starters
  On Starters.ID = RR.RunnersID
  AND Starters.Type = 'StartPoint' -- don't know how you're specifying this.
LEFT OUTER JOIN Runners AS Finishers
  On Finishers.ID = RR.RunnersID
  AND Finishers.Type = 'EndPoint' -- don't know how you're specifying this.
WHERE Starters.<Whatever> IS NULL
OR Finishers.<Whatever> IS NULL
于 2012-03-28T13:50:06.620 に答える
0

私はこれを使用することになりました-それが最善の解決策であったかどうかはまだ興味があります...私はまだ「冗長」を「非効率的」と同一視しています-そしてそれが良いマインドセットであるかどうかはわかりません. SQLエンジンがより「好き」になることをよりエレガントに述べる方法が必要であるよりも、コードが乱雑であるかどうかを理解するだけです..

もちろん-これは抽象化されています-実行されるQでさらに多くのフィルタリングが行われています-「概念」を簡単にするためにこれを最小限に切り詰めました-ありがとう

SELECT DISTINCT RaceID, RunnerID 
FROM (
  SELECT 
     raceID
    ,runnerID
    ,(
    SELECT count(stops.ID)
      FROM races
      JOIN stops
     WHERE raceid = main.raceID
       AND STOPTYPEID = 1
) AS poStart
,(
    SELECT count(stops.ID)
      FROM races
      JOIN stops
     WHERE raceid = main.raceID
       AND STOPTYPEID = 4
) AS poEnd


FROM races

WHERE x BETWEEN '2012-03-01 00:00:00.0' AND '2012-03-31 23:59:59.9'

ORDER BY race
) AS T1 WHERE poStart = 0 OR poEnd = 0
于 2012-03-28T15:28:54.410 に答える
0

この方法で、2 つの停止タイプ (開始、終了) で各人の停止回数を取得できます。これにより、ランナーが開始または終了のチェッ​​クインを行ったかどうかを示す列も表示されます。

create table #race
(
    raceid int,
    runnerid int
)
create table #stops
(
    runnerid int,
    stoptypeid int,
)

insert into #race values(133, 21)
insert into #race values(133, 23)
insert into #race values(133, 20)
insert into #race values(133, 33)

insert into #stops values(21, 1)
insert into #stops values(21, 4)
insert into #stops values(21, 3)
insert into #stops values(21, 2)
insert into #stops values(21, 2)
insert into #stops values(21, 2)
insert into #stops values(21, 2)
insert into #stops values(21, 2)
insert into #stops values(23, 2)
insert into #stops values(23, 2)
insert into #stops values(23, 2)
insert into #stops values(23, 2)
insert into #stops values(23, 4)

insert into #stops values(20, 3)
insert into #stops values(20, 1)

insert into #stops values(33, 4)
insert into #stops values(33, 1)


    SELECT r.raceid
        , r.runnerid
        , (select COUNT(*) 
            FROM #stops s
            WHERE S.runnerID = R.runnerID
                AND s.stoptypeid IN (1, 4)) as StartEndStops
    , CASE WHEN (SELECT COUNT(*) FROM #stops s WHERE S.runnerID = R.runnerID AND s.stoptypeid = 1) = 1 
            THEN 'Start Check-in'
            ELSE ''
        END as 'Start'
    , CASE WHEN (SELECT COUNT(*) FROM #stops s WHERE S.runnerID = R.runnerID AND s.stoptypeid = 4) = 1
            THEN 'End Check-in'
            ELSE ''
        END as 'End'
    FROM #race R    

drop table #race
drop table #stops

結果:

RaceId    RunnerId  StartEndStops     Start             End
133       21         2            Start Check-in    End Check-in
133       23         1                              End Check-in
133       20         1            Start Check-in
133       33         2            Start Check-in    End Check-in
于 2012-03-28T14:51:47.217 に答える