/ / Desvincular uma tabela, mas adicionar uma coluna de índice para numerar cada elemento na nova coluna com base em seu grupo - sql, sql-server

Desvincule uma tabela mas adicione uma coluna de índice para numerar cada elemento na nova coluna com base em seu grupo - sql, sql-server

Eu tenho uma mesa assim

+--+------+------+------+------+------+
|ID|Value1|Value2|Value3|Value4|Value5|
+--+------+------+------+------+------+
|1 |100   |105   |110   |134   |102   |
|2 |96    |45    |103   |100   |105   |
|3 |40    |85    |194   |134   |135   |
+--+------+------+------+------+------+

que eu posso desviar semelhante a este

SELECT
ID,
Value
FROM
(
SELECT
ID,
Value1,
Value2,
Value3,
Value4,
Value5
FROM
Tbl
) as src
UNPIVOT
(
Value for Values in (Value5, Value4, Value3, Value2, Value1)
) as up

e obter um resultado que se parece com isso

+--+-----+
|ID|Value|
+--+-----+
|1 |102  |
|1 |134  |
|1 |110  |
|1 |105  |
|1 |100  |
|2 |105  |
|2 |100  |
|2 |103  |
|2 |45   |
|2 |96   |
|3 |135  |
|3 |134  |
|3 |194  |
|3 |85   |
|3 |40   |
+--+-----+

Como posso adicionar uma coluna adicional parao resultado que numera cada item no unpivot. Preciso transformar nossos dados nesse formato para uma extração, e a indexação é usada para definir outros valores. Desvirar é novo para mim, eu imagino que precisa ser feito nesse bloco de alguma forma, já que é onde a ordenação existe - eu declaro explicitamente para desmotivar na ordem inversa da coluna. Não há nenhuma ordem diferente entre o resto das colunas para use um ORDER BY.

+--+-----+-----+
|ID|Value|Index|
+--+-----+-----+
|1 |102  |5    |
|1 |134  |4    |
|1 |110  |3    |
|1 |105  |2    |
|1 |100  |1    |
|2 |105  |5    |
|2 |100  |4    |
|2 |103  |3    |
|2 |45   |2    |
|2 |96   |1    |
|3 |135  |5    |
|3 |134  |4    |
|3 |194  |3    |
|3 |85   |2    |
|3 |40   |1    |
+--+-----+-----+

Respostas:

2 para resposta № 1

Descobri isso via seção 3 sobre valores e usando um CROSS APPLY

SELECT
t.*
FROM
tbl
CROSS APPLY (
VALUES
(ID, Value5, "5"),
(ID, Value4, "4"),
(ID, Value3, "3"),
(ID, Value2, "2"),
(ID, Value1, "1")
) t(ID, Value, Index)

0 para resposta № 2

Não tenho certeza sobre como o mecanismo determinará a ordem na qual atribuir o número da linha. Estou supondo que seja a ordem dos vals definidos no unpivot ...

DEMO: http://rextester.com/WTKLDR72234

SELECT ID
, val
, 6-row_number() over (partition by ID order by (Select null)) as Idx
FROM (SELECT ID
, Value1
, Value2
, Value3
, Value4
, Value5
FROM Tbl) as src
UNPIVOT
(
val for vals in (Value5, Value4, Value3, Value2, Value1)
) as up;