2012-03-01 3 views
0

Я пишу программу для бегущего конкурса с использованием базы данных SQLite, и мне нужно определить команды из данных финиша. В конкурсе участвуют школы, а одна команда состоит из четырех (ровно четырех) человек из одной школы. В школе может быть более одной команды. Позиция команды определяется суммой позиций членов. Конкурсанты хранятся в одной таблице с указанием названия финиша и школы.Как найти команды с командой 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, вы можете сделать следующее. (EDIT: Я заметил, что для школ необходимо иметь несколько команд. Это решение будет работать только с одной командой в школе. Насколько мне известно, вам потребуется рекурсивный CTE и ROW_NUMBER, в противном случае --- которые не являются доступны в SQLite к моему знанию)

Если нет, то вы, вероятно, придется использовать время цикла и временные таблицы, чтобы заполнить это. Если это так, тогда нет реального выигрыша от использования SQL, и я бы предложил перейти по коду.

EDIT: Однако это решение таблицы темпа, как было предложено. Вам нужно внутреннее время, так как вы можете иметь несколько команд в школе (что-то я пренебрег до и делает CROSS ОТНОСИТЬСЯ решение не работать без рекурсивного CTE и ROW_NUMBER, который был отредактирован для подтверждения)

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 
+0

Просто любопытно - как бы вы решили это с помощью временных таблиц? – Luke101

+0

Я только что обновил свой ответ, и в реализации этого я понял, что CROSS APPLY не будет работать. Предполагается, что SQL должен быть языком на основе SET, так как упомянутый выше код будет лучше, если только у вас не будет SQL, чтобы сделать это с помощью –

+0

. Кроме того, пожалуйста, не забудьте упредить и принять, если вам нравится ответ :) –

0
select pos, name , schoole, count(school) as teamSize 
from tableName 
where teamSize = 4 
groupby(school) 
Смежные вопросы