获取列具有最高值的行的列名称

时间:2014-07-17 14:33:27

标签: sql-server unpivot

我有一个包含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)的表,但由于分组,我无法将列名添加到此ID1,ID2和ID3上的子句。将pivot字段添加到此group by子句会导致显示所有未分配的数据。

1 个答案:

答案 0 :(得分: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