как найти команды с помощью команды sql - PullRequest
0 голосов
/ 01 марта 2012

Я пишу программу для соревнований по бегу с использованием базы данных SQLite, и мне нужно определить команды по финишным данным.В конкурсе участвуют школы, и одна команда состоит из четырех (ровно четырех) человек из одной школы.Школа может иметь более одной команды.Позиция команды определяется суммой позиций членов.Конкурсанты хранятся в одной таблице с указанием названия финишной позиции и школы.

Можно ли это сделать с помощью 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

Ответы [ 2 ]

1 голос
/ 01 марта 2012

Я знаю, что в SQLite нет ничего похожего на ROW_NUMBER () OVER ..., но я не могу найти ничего похожего на CROSS APPLY.

Если есть что-то, эквивалентное ПРИМЕНЕНИЮ CROSS, тогда вы можете сделать следующее.(РЕДАКТИРОВАТЬ: Я заметил требование, чтобы школы имели возможность иметь несколько команд. Это решение будет работать только с одной командой на школу. Насколько я могу судить, вам понадобятся рекурсивные CTE и ROW_NUMBER, в противном случае - которые не являютсяв SQLite, насколько мне известно)

SELECT  TeamTable.*
FROM    Table
CROSS APPLY
    (
        SELECT  TOP 4 *
        FROM Table AS InnerTable
        WHERE   InnerTable.school = Table.School
        ORDER BY InnerTable.Pos
    ) AS TeamTable

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

РЕДАКТИРОВАТЬ: Однако это решение для временной таблицы, как было запрошено.Вам нужно внутреннее время, поскольку в школе может быть несколько команд (то, что я раньше игнорировал и заставляло решение CROSS APPLY не работать без рекурсивных 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 голосов
/ 01 марта 2012
select pos, name , schoole, count(school) as teamSize
from tableName
where teamSize = 4
groupby(school)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...