将排名添加到每个组的第一行

why*_*heq 7 sql t-sql sql-server-2012

这是我想要的,但是有更简单,更优雅的方法吗?

IF OBJECT_ID('TEMPDB..#test') IS NOT NULL DROP TABLE #test;
CREATE TABLE #test
(
    userAcc VARCHAR(100),
    game VARCHAR(100),
    amount INT
);

INSERT INTO #test
values
    ('jas', 'x', 10),
    ('jas', 'y', 100),
    ('jas', 'z', 20),
    ('sam', 'j', 10),
    ('sam', 'q', 5);



--initial table sample
SELECT  userAcc,
        game,
        amount 
FROM    #test;


WITH 
X AS
(
    SELECT  rn = ROW_NUMBER() OVER (PARTITION BY userAcc ORDER BY game),
            userAcc,
            game,
            amount, 
            rk = RANK() OVER (PARTITION BY userAcc ORDER BY amount DESC)
    FROM    #test
),
Y AS
(
    SELECT  RK,userAcc,
            game,
            targ = rn
    FROM    X
    WHERE   rk = 1
)
SELECT  X.userAcc,
        X.game,
        X.amount,
        ISNULL(Y.targ,0) 
FROM    X 
        LEFT OUTER JOIN Y
        ON
        X.userAcc = Y.userAcc AND
        X.rn = Y.rk
ORDER BY X.userAcc,X.rn;
Run Code Online (Sandbox Code Playgroud)

它返回:

在此输入图像描述

这是初始表:

在此输入图像描述

脚本的作用是:

  1. 将新列添加到原始表
  2. 在新列中,为每个具有最高金额的用户添加游戏等级.
  3. 排名是游戏的字母位置,在用户的游戏中具有最高的金额.所以对于jas来说,他的最高比赛是y,并且在他的比赛中排名第二.
  4. 在步骤3中找到的等级应该仅对应于相应用户的第一个字母游戏.

Gor*_*off 4

你不需要join为此。可以利用积累。

如果我理解正确的话:

 select userAcc, game, amount,
        isnull( (case when rn = 1
               then max(case when rk = 1 then rn end) over (partition by userAcc)
           end),0) as newcol
  from (select t.*,
               ROW_NUMBER() OVER (PARTITION BY userAcc ORDER BY game) as rn,
               RANK() OVER (PARTITION BY userAcc ORDER BY amount DESC) as rk
        from #test t
       ) t
  order by userAcc;
Run Code Online (Sandbox Code Playgroud)