A (т.е. N столбцов), чтобы это сделать, чтобы Unpivot столбцов в строки, а затем можно использовать функцию оконного вызова, чтобы получить групповой мудрый максимум для каждого набора строк столбца. Тем не менее вам понадобится какой-то ключ для каждой строки, так что максимум можно применить по-разному (чтобы разрешить сборку исходных строк). Я сделал это, добавив суррогат Guid
через newId()
. Обратите внимание, это возвращает столбец NAME с наивысшим значением в каждой строке:
WITH MyTableWithRowId AS
(
SELECT newId() AS Id, *
FROM MyTable
),
Unpivoted AS
(
SELECT Ndx, Id, col, ROW_NUMBER() OVER (PARTITION BY Id ORDER BY col DESC) AS Rnk
FROM
MyTableWithRowId tbl
UNPIVOT
(
col for Ndx in(col1, col2, col3)
) p
)
SELECT Ndx
FROM Unpivoted
WHERE Rnk = 1
SqlFiddle here
Edit, повторно просто '1, 2, 3' не имя столбца (col1, col2, col3)
согласно @ комментарий Джорджи, если вы действительно хотите (один на основе) порядковый номер столбца в каждой строке, вы можете присоединиться обратно в DMV, таких как INFORMATION_SCHEMA.COLUMNS
смотреть вверх порядковое, хотя это было бы ужасно хрупкой стратегии ИМО.
WITH MyTableWithRowId AS
(
SELECT newId() AS Id, col1, col2, col3
FROM MyTable
),
TheOrdinalPositionOfColumns AS
(
SELECT COLUMN_NAME, ORDINAL_POSITION
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'MyTable'
),
Unpivoted AS
(
SELECT Ndx, Id, col, ROW_NUMBER() OVER (PARTITION BY Id ORDER BY col DESC) AS Rnk
FROM
MyTableWithRowId tbl
UNPIVOT
(
col for Ndx in(col1, col2, col3)
) p
)
SELECT topoc.ORDINAL_POSITION AS ColumnOrdinalPosition
FROM Unpivoted
JOIN TheOrdinalPositionOfColumns topoc ON Unpivoted.Ndx = topoc.COLUMN_NAME
WHERE Rnk = 1;
Updated Fiddle with Giorgi's Column naming
Если они равны, что вы хотите? –
Если они равны, просто игнорируйте их позже. – YukiSakura