【问题标题】:Show only the most frequest number SQL只显示最频繁的数字 SQL
【发布时间】:2020-09-09 03:29:43
【问题描述】:

如何只显示最高值? 即使有领带 所以无论如何都可以使用 MAX COUNT 使用 sqlLite

    SELECT GAMEID,
       COUNT(GAMEID) 

  FROM GAMES
 GROUP BY GAMEID
 ORDER BY COUNT(GAMEID) DESC

【问题讨论】:

    标签: sql sqlite greatest-n-per-group


    【解决方案1】:

    如果您希望多行具有相同的计数,您可以使用窗口函数来执行此操作并处理平局。

    您没有指定您的 DBMS 产品,但以下是 100% ANSI 标准 SQL:

    SELECT *
    FROM (
        SELECT gameid,
               count(*),
               dense_rank() over (order by count(*) desc) as rnk
        FROM games
        GROUP BY gameid
    ) t
    WHERE rnk = 1    
    

    Online example

    【讨论】:

    • 我正在使用 sql lite
    • @system21: sqlite 也支持窗口函数。我更新了在线演示以使用 SQLite
    • 好的,谢谢,但我仍然遇到语法错误。关于''("
    • @system21:不知道。正如我的链接所示,这在 SQLite 中无需更改即可工作
    • @system21 您可能使用的是早于窗口函数支持的过时 sqlite 版本。
    【解决方案2】:

    您可以在查询末尾添加“LIMIT 1”,它只会显示一个结果。但是,如果 2 个条目具有相同的结果,则显示哪一个是任意的。

    【讨论】:

    • 是的,我不能使用限制,因为有平局。因此不止一个条目
    【解决方案3】:

    如果你不关心领带,那就用LIMIT

    SELECT GAMEID, COUNT(GAMEID) AS CNT
    FROM GAMES
    GROUP BY GAMEID
    ORDER BY COUNT(GAMEID) DESC
    LIMIT 1;
    

    如果您想找到计数最高的游戏,包括可能的平局,那么RANK 分析函数在这里提供了一种选择:

    WITH cte AS (
        SELECT GAMEID, COUNT(GAMEID) AS CNT, RANK() OVER (ORDER BY COUNT(GAMEID) DESC) rnk
        FROM GAMES
        GROUP BY GAMEID
    )
    
    SELECT GAMEID, CNT
    FROM cte
    WHERE rnk = 1;
    

    【讨论】:

      【解决方案4】:

      因为听起来您使用的是过时的 sqlite 版本并且不能使用窗口函数,所以这里有另一种处理关系的方法:

      WITH counted AS (SELECT gameid, count(gameid) AS count FROM games GROUP BY gameid)
      SELECT gameid, count
      FROM counted
      WHERE count = (SELECT max(count) FROM counted);
      

      【讨论】:

        猜你喜欢
        • 2021-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-21
        • 2011-09-12
        • 1970-01-01
        相关资源
        最近更新 更多