Получить имя столбца для строки, в которой столбец имеет наибольшее значение

У меня есть таблица с 10 столбцами, первые 3 столбца используются как идентификаторы, а остальные 7 столбцов содержат числа.

Итак, структура моей таблицы выглядит так:

| ID1 | ID2 | ID3 | Data1 | Data2 | Data3 | Data4 | Data5 | Data6 | Data7 |

Теперь мне нужно получить имя столбца (Data1 - Data7) столбца, который имеет наибольшее значение для конкретной строки.

Таким образом, данные в таблице могут выглядеть так:

| A | B | C | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| A | B | D | 5 | 8 | 9 | 3 | 51 | 11 | 4 |
| D | A | F | 31 | 5 | 9 | 11 | 23 | 2 | 9 |

Желаемый результат для этого ввода будет:

| A | B | C | Data7 |
| A | B | D | Data5 |
| D | A | F | Data1 |

Я пробовал это с помощью запроса unpivot, и я могу получить таблицу, которая показывает данные ( 7, 51 и 23 ) в последнем столбце, но я не могу добавить к этому имена столбцов из-за предложения group by, которое на ID1, ID2 и ID3. Добавление поля сводки к этому предложению group by приводит к отображению всех данных без сводки.


person user1904304    schedule 17.07.2014    source источник
comment
Вы смотрели на заявления CASE ?? Пожалуйста, покажите нам, что вы пробовали.   -  person Dave Cullum    schedule 17.07.2014


Ответы (1)


Используйте оконные функции (ROW_NUMBER) вместо GROUP BY:

WITH Ordering AS
(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY ID1, ID2, ID3 ORDER BY Value DESC) AS OrderingValue
    FROM table
    UNPIVOT
    (
        Value FOR Source IN (Data1, Data2, Data3, Data4, Data5, Data6, Data7)
    ) up
)

SELECT *
FROM Ordering
WHERE OrderingValue = 1

Полученные результаты:

ID1 ID2 ID3 Value   Source  OrderingValue
A   B   C   7       Data7   1
A   B   D   51      Data5   1
D   A   F   31      Data1   1

Очевидно, вместо SELECT * FROM Ordering можно SELECT ID1, ID2, ID3, Source.

person Mark Sowul    schedule 17.07.2014