我有如下所示的输入表-

ID  Name q1     q2      q3      q4
1   a    2621   2036    1890    2300
2   b    18000  13000   14000   15000
3   c    100    200     300     400

我想为每一行的列(q1, q2, q3 and q4)数据排序。例如,如果我考虑上述输入的最后一行,则q4列包含的400值高于其他列,因此q4列的排名为1q3排名为2q2排名为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

输入表中存在超过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

请帮助我找到解决此问题的有效方法。

最佳答案

您需要UNPIVOTPIVOT:

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;

10-06 12:51