несколько топовых n запросов - PullRequest
1 голос
/ 05 января 2011

Мне трудно получить следующий запрос:

Допустим, у меня есть стол с большим количеством команд , и в каждой команде по 15 игроков (один-ко-многим на стол игрока).

Эти игроки упорядочены в команде через столбец Порядок от 0 до 14 и имеют два атрибута:

  • Очки набраны (целое число)
  • wasSick (логическое значение или целое число со значениями 0 для false или 1 для true)

Я бы хотел запрос, который возвращает строку для каждой команды , где первый столбец - это идентификатор команды (первичный ключ), а второй столбец - сумма очков, набранных из первых 11 игроки каждой команды, которые не были больны, используя порядок, определенный в столбце «Порядок».

Если за команду болеют более 3 игроков, она использует всех оставшихся.

Это против базы данных Oracle . Я попытался использовать ROWNUM, но мне нужен подобный rownum, который сбрасывается для каждой агрегации. Запрос может содержать подзапросы или использовать предложение WITH.

Спасибо!

PD: Если вы догадались, это футбольные / футбольные команды.

EDIT

Атрибут, используемый для определения порядка игроков в команде, является столбцом порядка. Давайте назовем его столбцом «Позиция», и он имеет целое число от 0 до 14. Поэтому, если в команде болеют игроки 2 и 4, мне нужна сумма очков, набранных игроками 0,1,3,5,6, 7,8,9,10,11 и 12.

Моя попытка была похожа на:

SELECT t.id, sum(p.points) FROM team t, points p WHERE p.t_id = t.id AND p.wasSick = 0 AND ROWNUM < 12 GROUP BY p.t_id

Что здесь не так, так это то, что мне не хватает ORDER BY p.position и что ROWNUM не сбрасывается между командами.

Ответы [ 2 ]

3 голосов
/ 05 января 2011

Поскольку нет ссылки на поле, которое можно использовать для идентификации первых 11 игроков (если ни один из игроков в команде не заболел), я использовал rowid, чтобы заказать их.Если вы можете обновить вопрос с таким полем, я могу изменить запрос.До тех пор:

SELECT team_id,
       SUM(points)
  FROM (
        SELECT t.team_id, 
               p.points
               ROW_NUMBER() OVER(PARTITION BY team_id ORDER BY player_id, p.rowid) rn
          FROM teams t, players p
              WHERE t.team_id = p.team_id
                AND p.wasSick = 0
        )
 WHERE rn < 12
 GROUP BY team_id
0 голосов
/ 05 января 2011

Как насчет этого:

select teamid, 
       sum(pointscored)
  from (select teamid, 
               pointscored, 
               row_number() over (partition by teamid order by orderid) rn
          from (select 1 teamid, 1 playerid, 0 orderid, 1 pointscored, 0 wassick from dual union all
                select 1 teamid, 2 playerid, 1 orderid, 1 pointscored, 0 wassick from dual union all
                select 1 teamid, 3 playerid, 2 orderid, 1 pointscored, 0 wassick from dual union all
                select 1 teamid, 4 playerid, 3 orderid, 1 pointscored, 0 wassick from dual union all
                select 1 teamid, 5 playerid, 4 orderid, 1 pointscored, 0 wassick from dual union all
                select 1 teamid, 6 playerid, 5 orderid, 1 pointscored, 0 wassick from dual union all
                select 1 teamid, 7 playerid, 6 orderid, 1 pointscored, 0 wassick from dual union all
                select 1 teamid, 8 playerid, 7 orderid, 1 pointscored, 0 wassick from dual union all
                select 1 teamid, 9 playerid, 8 orderid, 1 pointscored, 0 wassick from dual union all
                select 1 teamid, 10 playerid, 9 orderid, 1 pointscored, 0 wassick from dual union all
                select 1 teamid, 11 playerid, 10 orderid, 1 pointscored, 0 wassick from dual union all
                select 1 teamid, 12 playerid, 11 orderid, 1 pointscored, 0 wassick from dual union all
                select 1 teamid, 13 playerid, 12 orderid, 1 pointscored, 0 wassick from dual union all
                select 1 teamid, 14 playerid, 13 orderid, 1 pointscored, 0 wassick from dual union all
                select 1 teamid, 15 playerid, 14 orderid, 1 pointscored, 0 wassick from dual union all
                select 2 teamid, 1 playerid, 0 orderid, 1 pointscored, 1 wassick from dual union all
                select 2 teamid, 2 playerid, 1 orderid, 1 pointscored, 1 wassick from dual union all
                select 2 teamid, 3 playerid, 2 orderid, 1 pointscored, 1 wassick from dual union all
                select 2 teamid, 4 playerid, 3 orderid, 1 pointscored, 1 wassick from dual union all
                select 2 teamid, 5 playerid, 4 orderid, 1 pointscored, 0 wassick from dual union all
                select 2 teamid, 6 playerid, 5 orderid, 1 pointscored, 0 wassick from dual union all
                select 2 teamid, 7 playerid, 6 orderid, 1 pointscored, 0 wassick from dual union all
                select 2 teamid, 8 playerid, 7 orderid, 1 pointscored, 0 wassick from dual union all
                select 2 teamid, 9 playerid, 8 orderid, 1 pointscored, 0 wassick from dual union all
                select 2 teamid, 10 playerid, 9 orderid, 1 pointscored, 0 wassick from dual union all
                select 2 teamid, 11 playerid, 10 orderid, 1 pointscored, 0 wassick from dual union all
                select 2 teamid, 12 playerid, 11 orderid, 1 pointscored, 0 wassick from dual union all
                select 2 teamid, 13 playerid, 12 orderid, 1 pointscored, 0 wassick from dual union all
                select 2 teamid, 14 playerid, 13 orderid, 1 pointscored, 0 wassick from dual union all
                select 2 teamid, 15 playerid, 14 orderid, 1 pointscored, 0 wassick from dual
               ) teams
         where wassick = 0
       )
 where rn <= 11
group by teamid;

, который возвращает:

    TEAMID SUM(POINTSCORED)
---------- ----------------
         1               11
         2               11

2 rows selected.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...