如何使用此代码清除重复项?

时间:2019-05-23 18:32:19

标签: mysql

在下面的简化表格中,我需要让最快达到某些里程碑且游戏总数最少的玩家:

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

因此,我希望对查询进行修改,以删除重复的名称,而只给我玩家名称的第一个实例。

有人可以帮我吗?谢谢

1 个答案:

答案 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

DEMO