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 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 に答える
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 に答える