只显示最新/最新的记录

时间:2013-02-21 11:30:39

标签: sql window-functions

好的,所以我有一个显示级别的列和一个显示已停止在该特定级别播放的玩家的列。

现在玩到5级的玩家也会被列入4级,3级,2级和1级。这正是我不想要的。 如果一名球员已经打到5级,我希望他只能在第5级的行上计算,依此类推。

怎么做?

例如,这就是我得到的:

level  stopped_playing
101     2632
102     1206
103     970
104     920

这就是我想要的:

level  stopped_playing
101     1426
102     236
103     50
104     920

920名玩家达到104级(当然因此打了101级)并且在那里停止了,1426只玩了101级并且已经停在那里。 但在结果中我得到达到等级4的920也计入101级。

如何避免?

4 个答案:

答案 0 :(得分:0)

做这样的事情(适应你的实际表格):

select stopped_level, count(player) from (
        select player, max(level) as stopped_level
            from whatever_your_tables_are
            group by player
    )
    group by stopped_level

注意:将来列出您的表格及其结构会很有帮助。此外,最好提及您使用的SQL品牌,因为它们都具有不同的功能。

答案 1 :(得分:0)

考虑到你的表结构的粗略想法将是

Select Level, count(*) 
from (select player, max(Level)  as 'Level'
from table group by player) group by Level; 

希望这有帮助

答案 2 :(得分:0)

您尚未提及您的RDBMS。使用窗口函数可以轻松解决问题,这些函数存在于PostgreSQL,ORACLE,DB2,SQL Server 2012,Teradata,Sybase和Vertica中。

以下查询在PostgreSQL上测试(也在SQL Fiddle上):

SELECT *,
       stopped_playing - lag(stopped_playing,1,0)
                             OVER (ORDER BY level DESC) wanted
  FROM tab
 ORDER BY level;

答案 3 :(得分:0)

这是一个很棒的窗口函数应用程序。假设最高级别是最高级别,请尝试:

select maxlevel, COUNT(*) as Stopped_Playing
from (select t.*,
             MAX(level) over (partition by playerid) as maxlevel
      from t
     ) t
group by maxlevel
order by maxlevel