我有如下所示的输入表-
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
列的排名为1
,q3
排名为2
,q2
排名为3
,q1
排名为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
请帮助我找到解决此问题的有效方法。
最佳答案
您需要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;