2012-03-01 6 views
0

私はSQLiteデータベースを使ってランニングコンテストのプログラムを書いています。私は終了データからチームを決定する必要があります。コンテストに参加する学校があり、1チームは1つの学校から4人(正確には4人)の人で構成されています。学校は複数のチームを持つことができます。チームのポジションは、メンバーのポジションの合計によって決まります。参加者は、1つのテーブルに、その終了位置の名前と学校が格納されます。SQLコマンドでチームを見つける方法

SQLクエリで行うことはできますか、それともコードで解決する必要がありますか?

Example: 
pos  name school   pos name  school 
1  person1 foo    1  person1 foo 
2  person2 foo    2  person2 foo 
3  person3 bar    6  person6 foo 
4  person4 bar    8  person8 foo 
5  person5 bar  ->  3  person3 bar 
6  person6 foo    4  person4 bar 
7  person7 bar    5  person5 bar 
8  person8 foo    7  person7 bar 
9  person9 foo 
10  person10 foo 
11  person11 bar 
+0

正確に4または> = 4? –

答えて

1

私はROW_NUMBER(のようなものは何もありません知っている)OVER ... SQLiteので、私はCROSS APPLYに似た何かについて何かを見つけることができません。

CROSS APPLYに相当するものがある場合は、次のことができます。 (編集:私は学校が複数のチームを持つことができるという要件に気付きました。この解決策は、1チームにつき1チームしか働かないことになります。私の知る限りでSQLiteで利用可能)

もしそうでなければ、whileループとtempテーブルを使用してこれを埋める必要があります。その場合、SQLを使用することで実際の利益は得られません。コードルートに進むことをお勧めします。

編集: ただし、これは要求された一時テーブルソリューションです。もしあなたが学校内で複数のチームを持っている可能性があるので

CREATE TABLE #SchoolList 
    (Id INT IDENTITY(1,1), School VARCHAR(50)) 

INSERT INTO #SchoolList 
SELECT DISTINCT School 
FROM TeamTable 

CREATE TABLE #TeamList 
    (TeamNumber INT IDENTITY(1,1), Pos INT, Name VARCHAR(50), 
     School VARCHAR(50)) 

DECLARE @CurrentSchool VARCHAR(50), @CurrentSchoolPos INT 
DECLARE @CurrentSchoolLookupId INT 
SET @CurrentSchoolId = 1 
WHILE EXISTS (SELECT 1 FROM #SchoolList WHERE Id > @CurrentSchoolLookupId) 
BEGIN 
    SELECT @CurrentSchool = School FROM #SchoolList 
     WHERE Id = @CurrentSchoolLookupId 
    SET @CurrentSchoolPos = SELECT TOP 1 Pos FROM TeamTable 
          WHERE School = @CurrentSchool 
          ORDER BY POS 
    WHILE ISNULL(@CurrentSchoolPos, 0) > 0 
    BEGIN 
     INSERT INTO #TeamList 
     SELECT Pos, Name, School 
     FROM TeamTable 
     WHERE School = @CurrentSchool AND Pos = @CurrentSchoolPos 

     SET @CurrentSchoolPos = SELECT TOP 1 Pos FROM TeamTable 
           WHERE School = @CurrentSchool 
            AND Pos > @CurrentSchoolPos ORDER BY POS 
    END 
    SET @CurrentSchoolLookupId = @CurrentSchoolLookupId + 1 
END 

SELECT * FROM #TeamList 

(私は前に無視し、CROSSを確認するために編集された再帰CTEとROW_NUMBER、なしでは動作しませ溶液を塗布せていた何かを)内部しばらく必要
+0

ちょっと興味があります - これを一時テーブルでどうやって解決しますか? – Luke101

+0

私はちょうど私の答えを更新し、これを実装するにはCROSS APPLYが動作しないことに気付きました。 SQLは –

+0

でこれを行うSQLを持っていない限り、言及したように、コードのアプローチは、より良いだろう、SETベースの言語になるはずですまた、あなたが答えが好きならば、upvoteを忘れないでください:) –

0
select pos, name , schoole, count(school) as teamSize 
from tableName 
where teamSize = 4 
groupby(school) 
関連する問題