【问题标题】:Fetch one row per account id from list从列表中获取每个帐户 ID 的一行
【发布时间】:2010-09-10 19:55:51
【问题描述】:

我有一个包含游戏分数的表格,每个帐户 ID 允许多行:scores (id, score, accountid)。我想要一份前 10 名得分手 ID 及其得分的列表。

你能提供一个sql语句来选择前10个分数,但每个帐户id只有一个分数吗?

谢谢!

【问题讨论】:

    标签: sql mysql database


    【解决方案1】:

    试试这个:

    select top 10 username, 
                  max(score) 
    from usertable 
    group by username 
    order by max(score) desc
    

    【讨论】:

    • “前 10 名”是新的吗?我不记得以前见过它?
    • 依赖于 DBMS -- 它是 2000 年 SQL Server 的新功能
    【解决方案2】:

    我相信 PostgreSQL(至少 8.3)将要求 DISTINCT ON 表达式必须匹配初始 ORDER BY 表达式。 IE。当你有ORDER BY score DESC 时,你不能使用DISTINCT ON (accountid)。要解决此问题,请将其添加到 ORDER BY:

    SELECT DISTINCT ON (accountid) *
    FROM scoretable
    ORDER BY accountid, score DESC
    LIMIT 10;
    

    使用此方法可以选择表中的所有列。即使 score 有重复的“max”值,它也只会为每个 accountid 返回 1 行。

    这对我很有用,因为我没有找到最高分数(使用 max() 函数很容易做到),而是最近一次为 accountid 输入了分数。

    【讨论】:

      【解决方案3】:
      SELECT accountid, MAX(score) as top_score
      FROM Scores
      GROUP BY accountid,
      ORDER BY top_score DESC
      LIMIT 0, 10

      这在 mysql 中应该可以正常工作。您可能需要使用 'ORDER BY MAX(score) DESC' 而不是那个 order by - 我手头没有我的 SQL 参考。

      【讨论】:

        【解决方案4】:

        首先将选择限制为每个帐户 ID 的最高分。 然后取前十名。

        SELECT TOP 10 AccountId, Score
        FROM Scores s1
        WHERE AccountId NOT IN 
            (SELECT AccountId s2 FROM Scores 
             WHERE s1.AccountId = s2.AccountId and s1.Score > s2.Score)
        ORDER BY Score DESC
        

        【讨论】:

        • 事实证明这似乎更好,因为它选择了整行。另一个最大查询仅将最大分数附加到每个 accountid 的随机行。
        • 固定:SELECT * FROM scores s1 WHERE accountid NOT IN (SELECT accountid FROM scores s2 WHERE s1.accountid = s2.accountid and s1.score
        • 我在这个查询中唯一剩下的问题是,当该帐户多次出现其最高分时,每个 accountid 会得到不止一行。因此,如果 accoundid 6 的得分为 50、75、40、75,则查询返回得分为 75 的两行。
        【解决方案5】:
        select username, max(score) from usertable group by username order by max(score) desc limit 10;
        

        【讨论】:

          【解决方案6】:

          PostgreSQL 有 DISTINCT ON 子句,以这种方式工作:

          SELECT DISTINCT ON (accountid) id, score, accountid
          FROM scoretable
          ORDER BY score DESC
          LIMIT 10;
          

          虽然我不认为它是标准 SQL,所以希望其他数据库以不同的方式执行它。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-01-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-08-10
            • 2022-01-04
            • 1970-01-01
            相关资源
            最近更新 更多