3

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

表十

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

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

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

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

在此处输入图像描述

JOIN如果可以避免,我宁愿不必在 mx 上;所以我认为循环是唯一的方法?

4

4 回答 4

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 的最高值)。

我的小提琴结果

于 2012-06-15T14:26:44.927 回答
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

于 2012-06-15T14:26:52.547 回答
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小提琴

于 2012-06-15T14:29:09.347 回答
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
于 2012-06-15T14:29:29.823 回答