首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从列表中为每个帐户id提取一行,第2部分

问从列表中为每个帐户id提取一行,第2部分
EN

Stack Overflow用户
提问于 2008-09-25 01:47:41
回答 6查看 683关注 0票数 3

不确定如何询问SO的后续问题,但这是参考前面的一个问题:Fetch one row per account id from list

我使用的查询是:

代码语言:javascript
复制
SELECT *
FROM scores s1
WHERE accountid NOT IN (SELECT accountid FROM scores s2 WHERE s1.score < s2.score)
ORDER BY score DESC

这将选择最高的分数,并将结果限制为每个帐户and的一行;它们的最高分数。

最后一个障碍是,此查询将为多次出现最高分的帐户is返回多个行。因此,如果accountid 17的分数为40、75、30、75,则查询将返回分数为75的两行。

是否有人可以修改此查询(或提供更好的查询)来修复此情况,并真正将其限制为每个帐户id只有一行?

再次感谢!

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2008-09-25 07:16:42

如果您只对帐户If和分数感兴趣,那么可以使用上面Paul给出的简单的GROUP BY查询。

代码语言:javascript
复制
SELECT accountid, MAX(score) 
FROM scores 
GROUP BY accountid;

如果您需要来自分数表的其他属性,则可以使用如下查询从该行获取其他属性:

代码语言:javascript
复制
SELECT s1.*
FROM scores AS s1
  LEFT OUTER JOIN scores AS s2 ON (s1.accountid = s2.accountid 
    AND s1.score < s2.score)
WHERE s2.accountid IS NULL;

但这仍然会产生多个行,在您的示例中,给定的accountid有两个分数与其最大值匹配。要进一步将结果集减少到单个行,例如具有最新gamedate的行,请尝试执行以下操作:

代码语言:javascript
复制
SELECT s1.*
FROM scores AS s1
  LEFT OUTER JOIN scores AS s2 ON (s1.accountid = s2.accountid 
    AND s1.score < s2.score)
  LEFT OUTER JOIN scores AS s3 ON (s1.accountid = s3.accountid 
    AND s1.score = s3.score AND s1.gamedate < s3.gamedate) 
WHERE s2.accountid IS NULL
    AND s3.accountid IS NULL;
票数 2
EN

Stack Overflow用户

发布于 2008-09-25 01:52:37

代码语言:javascript
复制
select accountid, max(score) from scores group by accountid;
票数 2
EN

Stack Overflow用户

发布于 2008-09-25 03:23:54

如果您的RDBMS支持它们,那么分析函数将是一种很好的方法,特别是当您需要行的所有列时。

代码语言:javascript
复制
select ...
from   (
   select accountid,
          score,
          ...
          row_number() over 
               (partition by accountid
                    order by score desc) score_rank
   from   scores)
where score_rank = 1;

在您描述的情况下,返回的行是不确定的,但您可以轻松地修改分析函数,例如,通过对(score desc,test_date desc)进行排序,以获得两个匹配的较高分数中较新的一个。

其他基于排名的分析函数也会达到类似的目的。

如果你不介意重复,那么下面的方法可能比你当前的方法更有效:

代码语言:javascript
复制
select ...
from   (
   select accountid,
          score,
          ...
          max(score) over (partition by accountid) max_score
   from   scores)
where score = max_score;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/131056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档