0

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

现在一个玩到 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

4 回答 4

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,因为它们都有不同的功能。

于 2013-02-21T11:34:18.203 回答
0

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

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

希望这可以帮助

于 2013-02-21T11:35:51.037 回答
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
于 2013-02-21T14:37:49.900 回答
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;
于 2013-02-21T11:46:38.953 回答