3

SQL Server 2008R2 db に次の構造を持つテーブル X があります (500k を超えるレコードがあります)。

表 X

各 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

これはうまくいくはずだと思います

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 に答える
1

最初に最大レコードを取得し、それを使用して他のフィールドを取得する必要があります。同じ UserAccountKey に対して同じ最大値が 2 回ある場合、そのキーに対して 2 つのレコードが取得されることに注意してください。

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 に答える