Как присвоить ранги нескольким столбцам данных в SQL Server? - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть входная таблица, как показано ниже -

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

Пожалуйста, помогите мне найти эффективный способ решения этой проблемы.

1 Ответ

0 голосов
/ 04 февраля 2019

Вам нужно 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;
...