使用SQL查找最大信息

时间:2012-06-15 14:19:41

标签: sql sql-server-2008

我在sql server 2008R2 db中有一个具有以下结构的表X(有> 500k记录):

Table X

很容易找到每个UserAccountKey的最大mx:

SELECT 
UserAccountKey
, MAX(mx) mx2
FROM X
GROUP BY UserAccountKey

但是我想修改上面的内容,以便在最大值发生时它还有记录的SessionId和GamingServerId。

这是SQL Fiddle中的工作台。我所追求的结果如下

enter image description here

如果可以避免,我宁愿不必在{x}上使用JOIN;所以我假设循环是唯一的方法?

4 个答案:

答案 0 :(得分:2)

您还可以使用排名查询:

select 
  UserAccountKey
  , SessionId
  , GamingServerId
  , mx
from (

SELECT
    rank() over (partition by UserAccountKey
                 order by mx desc) as rank
    , UserAccountKey
    , SessionId
    , GamingServerId
    , mx
FROM X )data
where rank = 1

这将基本上按UserAccountkey对所有内容进行分组,然后通过mx desc对其进行排序。 然后它只是选择已被赋予等级1的所有内容的问题(该UserAccountKey的mx的最高值)。

My Fiddle results

答案 1 :(得分:2)

您可以使用CTE ROW_NUMBER窗口函数:

WITH cte AS(
    SELECT 
        RN=ROW_NUMBER()OVER(PARTITION BY UserAccountKey ORDER BY mx DESC),
        UserAccountKey,
        SessionId, 
        GamingServerId,
        mx
    FROM X
)
SELECT  
    UserAccountKey,
    SessionId,
    GamingServerId,
    mx
FROM cte
WHERE RN = 1

这是你的小提琴:http://sqlfiddle.com/#!3/a9e0a/13

答案 2 :(得分:1)

您需要先获取最大记录,然后使用它来获取其他字段。请注意,如果您对同一UserAccountKey具有两次相同的最大值,则您将获得该密钥的两条记录。

select UserAccountKey, 
       SessionId, 
       GamingServerId, 
       mx
from x x1
where mx in
(SELECT MAX(mx) mx2
 FROM X x2
 WHERE x1.UserAccountKey = x2.UserAccountKey)

SQL Fiddle

答案 3 :(得分:1)

我认为这应该有用

SELECT  UserAccountKey, SessionId, GamingServerId,mx 
FROM (SELECT UserAccountKey, SessionId, GamingServerId,mx, RANK()
      OVER (PARTITION BY UserAccountKey ORDER BY mx DESC) N
      FROM X
)M WHERE N = 1