我很难获得以下查询:
假设我有一个包含大量球队的桌子,每个球队有15个球员(对阵球员表一对多)。
这些玩家在团队中通过Order列从0到14进行排序,并具有两个属性:
我想要一个为每个团队返回行的查询,其中第一列是团队ID(主键),第二列是从第一列得分的总和使用Order列定义的订单,每个团队的11名玩家没有生病。
如果有超过3名球员因为一支球队而生病,那么它将使用所有剩余球员。
这是针对 Oracle 数据库的。我尝试使用ROWNUM但是我需要一个类似的rownum来重置每个聚合。查询可能包含子查询或使用WITH子句。
谢谢!
PD:如果你猜对了,他们就是足球/足球队。
修改
用于了解团队中球员顺序的属性是订单栏。我们称之为位置列,它具有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 :(得分: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
答案 1 :(得分: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.