2013-02-21 4 views
0

ok, поэтому у меня есть столбец, показывающий уровни и столбец, показывающий игроков, которые перестали играть на этом определенном уровне.только получите последнюю/новейшую запись, чтобы показать

Теперь игрок, который играл на уровень 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 и остановился там уже. , но в результате я получаю 920, которые достигли уровня 4, также учитываются на уровне 101 строки.

как этого избежать?

+1

Pl Опубликовать свою структуру таблицы – Meherzad

+2

Какая СУБД вы используете? Oracle? Postgres? –

ответ

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 вы используете, поскольку все они имеют разные возможности.

0

Грубая идея с учетом структуры таблицы будет

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

Надеется, что это помогает

0

Вы не упомянули РСУБД. Проблема может быть легко решена с использованием оконных функций, существующих в 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; 
+0

Функции окна также доступны в DB2, SQL Server 2012, Teradata, Sybase и Vertica. –

+0

@a_horse_with_no_name, спасибо, я уверен, что бой ORACLE и Postgres, поэтому я упомянул их. Обновлен мой ответ. – vyegorov

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 
Смежные вопросы