在下面的简化表格中,我需要让最快达到某些里程碑且游戏总数最少的玩家:
create table eg(
kills integer,
matchid integer,
playername varchar(30)
date date
)
INSERT INTO eg (kills,matchid,playername,date) values(12,1,'niko','2015-01-01');
INSERT INTO eg (kills,matchid,playername,date) values(13,2,'niko','2015-01-02');
INSERT INTO eg (kills,matchid,playername,date) values(5,3,'device','2015-01-03');
INSERT INTO eg (kills,matchid,playername,date) values(6,4,'niko','2015-01-04');
INSERT INTO eg (kills,matchid,playername,date) values(5,5,'device','2015-01-05');
INSERT INTO eg (kills,matchid,playername,date) values(5,3,'device','2015-01-06');
INSERT INTO eg (kills,matchid,playername,date) values(5,3,'device','2015-01-07');
但是导致重复。
我使用的查询如下:
select distinct(playername),sum_value,game_played
from(
select playername,
sum(kills) over (partition by playername order by date asc, matchid asc) as sum_value,
count(*) over (partition by playername order by date asc, matchid asc) as game_played
from eg) as so
where sum_value>15
order by game_played asc
我理想的结果是下面的
playname sum_value game_played
niko 25 2
device 20 4
但是我得到的是:
playname sum_value game_played
niko 25 2
niko 31 3
device 20 4
因此,我希望对查询进行修改,以删除重复的名称,而只给我玩家名称的第一个实例。
有人可以帮我吗?谢谢
答案 0 :(得分:1)
您可以在子查询的结果上使用窗口函数来获取每个玩家的第一行。
select playername,sum_value,game_played
from (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY playername ORDER BY game_played) `rank`
from(
select playername,
sum(kills) over (partition by playername order by date asc, matchid asc) as sum_value,
count(*) over (partition by playername order by date asc, matchid asc) as game_played
from eg) as so
where sum_value>15) AS t1
WHERE `rank` = 1
order by game_played asc