如何在SQL Server中为多列数据提供排名?

Dat*_*der 12 sql-server sql-server-2012

我有输入表,如下所示 -

ID  Name q1     q2      q3      q4
1   a    2621   2036    1890    2300
2   b    18000  13000   14000   15000
3   c    100    200     300     400
Run Code Online (Sandbox Code Playgroud)

我想要q1, q2, q3 and q4每行的列()数据排名.例如,如果我考虑上面输入的最后一行,那么q4列包含的400值高于其他列,因此排名q4将是1,q3排名将是2,q2排名将是3q1排名将是4.

我正在寻找像 - 的输出

id  name  q1  q2  q3  q4
1   a     1   3   4   2
2   b     1   4   3   2
3   c     4   3   2   1
Run Code Online (Sandbox Code Playgroud)

输入表中存在超过100,000条记录.

我为输入表创建了小的SQL脚本,即

declare @temp table (ID int, Name varchar(10), q1 int, q2 int, q3 int, q4 int)

insert into @temp
select 1, 'a', 2621, 2036, 1890, 2300
union all
select 2, 'b', 18000, 13000, 14000, 15000
union all
select 3, 'c', 100, 200, 300, 400

select * from @temp
Run Code Online (Sandbox Code Playgroud)

请帮我找到解决这个问题的有效方法.

Yog*_*rma 9

你需要UNPIVOT&PIVOT:

SELECT Id, Name, 
       MAX(CASE WHEN qname = 'q1' THEN SEQ END),
       MAX(CASE WHEN qname = 'q2' THEN SEQ END),
       MAX(CASE WHEN qname = 'q3 'THEN SEQ END),
       MAX(CASE WHEN qname = 'q4 'THEN SEQ END)
FROM (SELECT t.*, tt.*, 
             DENSE_RANK() OVER (PARTITION BY t.Name ORDER BY tt.qq DESC) AS SEQ
      FROM @temp t CROSS APPLY
           ( VALUES (q1, 'q1'), (q2, 'q2'), (q3, 'q3'), (q4, 'q4') 
           ) tt(qq, qname)
     ) t
GROUP BY t.Id, t.Name;
Run Code Online (Sandbox Code Playgroud)