/ / Unpivot eine Tabelle, aber fügen Sie eine Indexspalte zur Nummerierung jedes Elements in der neuen Spalte basierend auf seiner Gruppe - SQL, SQL-Server

Entsperren Sie eine Tabelle, fügen Sie jedoch eine Indexspalte hinzu, um jedes Element in der neuen Spalte basierend auf seiner Gruppe zu nummerieren - sql, sql-server

Ich habe einen Tisch wie diesen

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

das kann ich ähnlich entpivotieren

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

und bekomme ein Ergebnis, das so aussieht

+--+-----+
|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   |
+--+-----+

Wie kann ich eine zusätzliche Spalte hinzufügen?das Ergebnis, das jedes Element im Unpivot nummeriert. Ich muss unsere Daten in dieses Format für einen Extrakt umwandeln, und die Indizierung wird verwendet, um andere Werte zu setzen. Unpivoting ist neu für mich, ich stelle mir vor, dass es in diesem Block irgendwie gemacht werden muss, da dort die Ordnung existiert - ich habe explizit angegeben, in der umgekehrten Spaltenreihenfolge zu entpivotieren. Es gibt keine Reihenfolge unter den anderen Spalten benutze ein 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    |
+--+-----+-----+

Antworten:

2 für die Antwort № 1

Ich habe es mir überlegt Abschnitt 3 über Werte und mit a 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 für die Antwort № 2

Ich bin mir unsicher, wie die Engine die Reihenfolge bestimmen wird, in der die Zeilennummer vergeben wird. Ich gehe davon aus, dass es die Reihenfolge der im Unpivot definierten Werte ist ...

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;