2016-03-18 53 views
7

Điều này đang trả về những gì tôi muốn nhưng có cách tiếp cận đơn giản hơn, thanh lịch hơn không?Thêm xếp hạng vào hàng đầu tiên của mỗi nhóm

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; 

Nó trả về này:

enter image description here

Dưới đây là bảng ban đầu:

    :

    enter image description here

    gì kịch bản được làm điều này là 0

  1. Thêm cột mới vào bảng gốc
  2. Trong cột mới, hãy thêm thứ hạng của trò chơi cho mỗi người dùngAcc với số tiền cao nhất.
  3. Xếp hạng là vị trí theo thứ tự chữ cái của trò chơi có số tiền cao nhất trong số các trò chơi của người dùng. Vì vậy, cho jas trò chơi cao nhất của mình là y và đó là vị trí thứ 2 trong số các trò chơi của mình.
  4. Xếp hạng được tìm thấy ở bước 3 chỉ nên chống lại trò chơi chữ cái đầu tiên của người dùng tương ứng.
+0

Bạn nên sửa câu hỏi và cung cấp kết quả là tốt. –

+0

@GordonLinoff .... sẽ làm ngay bây giờ – whytheq

Trả lời

4

Bạn không cần join cho việc này. Bạn có thể sử dụng tích lũy.

Nếu tôi hiểu đúng:

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; 
+0

Câu trả lời rất thanh lịch. – whytheq

Các vấn đề liên quan