我有一个包含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子句会导致显示所有未分配的数据。
答案 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
。