我在sql server 2008R2 db中有一个具有以下结构的表X(有> 500k记录):
很容易找到每个UserAccountKey的最大mx:
SELECT
UserAccountKey
, MAX(mx) mx2
FROM X
GROUP BY UserAccountKey
但是我想修改上面的内容,以便在最大值发生时它还有记录的SessionId和GamingServerId。
这是SQL Fiddle中的工作台。我所追求的结果如下
如果可以避免,我宁愿不必在{x}上使用JOIN
;所以我假设循环是唯一的方法?
答案 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的最高值)。
答案 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
答案 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)
答案 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