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排名将是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
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)
请帮我找到解决这个问题的有效方法.
你需要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)