Đ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:
Dưới đây là bảng ban đầu:
-
:
- Thêm cột mới vào bảng gốc
- 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.
- 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.
- 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.
gì kịch bản được làm điều này là 0
Bạn nên sửa câu hỏi và cung cấp kết quả là tốt. –
@GordonLinoff .... sẽ làm ngay bây giờ – whytheq