只显示最新/最新记录

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

【讨论】:

以上是关于只显示最新/最新记录的主要内容,如果未能解决你的问题,请参考以下文章

仅显示每天的最新日期记录

为最新记录添加附加值(但显示所有记录)

如何只显示最新的文档?

Swift:多个本地通知,但只显示最新的

如何在 laravel 的刀片文件中显示最新('updated_at')记录

快速入门Git,通俗详细,一次就会,最新更新