2011-01-04 3 views
1

Я столкнулся с трудом, чтобы получить следующий запрос:множественным топ п запросов

Скажем, у меня есть таблица с большим количеством команд и каждая команда имеет 15 игроков (взаимно многие к игровому столу).

Тех игроков упорядочивается в команде, через колонку заказа, от 0 до 14 и имеет два атрибута:

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

Я хотел бы запрос, который возвращает строку для каждой команды, где первый столбец является команда идентификатор (первичный ключ) и второй столбец является суммой точек забил с первых 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 не сбрасывается между командами.

+0

Когда вы говорите, "очки, набранные из первых 11 игроков каждой команды" есть ли атрибут/колонку, которую можно использовать для их заказа? – Chandu

+1

Можете ли вы опубликовать свои попытки? –

ответ

3

Поскольку нет ссылки на поле, которое может быть использовано для идентификации первых 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

Я нашел ROW_NUMBER при поиске решения, но не понял его. Теперь это понятно с вашим примером. Я попробую этот подход, когда вернусь к работе завтра. – Luciano

+0

Да, row_number был тем, что я искал. – Luciano

0

Как об этом:

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

почти так же, как @Cybernate, но упорядочивается по заказу в окошке. Великие мысли думают одинаково. –

+0

Хорошо, вы поняли, в чем моя проблема, теперь я должен понять ваше решение! Запрос внутри запроса в запросе звучит глубоко, не говоря уже о том, что требуемый мне запрос уже войдет в более крупный запрос. – Luciano

+0

@Luciano: Вложенные запросы не следует опасаться. Большая часть моего запроса - это выборочные данные. То, что он делает, это: 1) Исключение больных людей 2) Использование аналитической функции (row_number) для каждой команды, чтобы дать восходящее число каждой строке для этой команды, заказанной заказчиком 3) Выкалывание всех, кроме цифр 1-11, из результаты нашей аналитической функции. 4) Группировка по сумме очков. –

Смежные вопросы