Я знаю, что в 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