只显示最新/最新记录
Posted
技术标签:
【中文标题】只显示最新/最新记录【英文标题】:only get the latest/newest record to show 【发布时间】:2013-02-21 11:30:38 【问题描述】:好的,所以我有一个显示级别的列和一个显示已停止在该特定级别玩的玩家的列。
现在一个玩到 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 级行中。
如何避免?
【问题讨论】:
请发布您的表格结构 您使用的是哪个 DBMS?甲骨文? Postgres? 【参考方案1】:做这样的事情(适应你的实际表格):
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,因为它们都有不同的功能。
【讨论】:
【参考方案2】:考虑到您的表结构的粗略想法将是
Select Level, count(*)
from (select player, max(Level) as 'Level'
from table group by player) group by Level;
希望对你有帮助
【讨论】:
【参考方案3】:您还没有提到您的 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;
【讨论】:
窗口函数也可用于 DB2、SQL Server 2012、Teradata、Sybase 和 Vertica。 @a_horse_with_no_name,谢谢,我很确定 ORACLE 和 Postgres,所以我提到了它们。更新了我的答案。【参考方案4】:这是一个很好的窗口函数应用程序。假设***别是最高值,试试这个:
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
【讨论】:
以上是关于只显示最新/最新记录的主要内容,如果未能解决你的问题,请参考以下文章