2016-03-19 13 views
0

Sie haben Angenommen, eine Tabelle Table1 mit SäulenSpalten Join Zeilen

UserId, element1, Element2, Item3, Item4, Item5, Item6, Item7, Item8, Item9, item10

und Sie haben eine andere Tabelle Table2 mit

UserId, ItemId, Namens

. Die Werte in Table1 sind die ItemId von Table2. Ich habe eine Notwendigkeit

UserId anzuzeigen, ItemId, Namens-

wo element1 1. und item10 ist letzte und Sie haben 10 Zeilen. Mit anderen Worten, Item1 ist die erste Zeile und Item10 ist die letzte Zeile. Wenn es eine Möglichkeit gibt, CASE WHEN zu vermeiden, wäre das großartig. Ich habe vielleicht mehr Spalten in der Zukunft und würde hassen, die 10 Spalten hart zu kodieren.

+0

Was ist der Sinn von table1 wenn table2 bereits alle benötigten Informationen hat? Ist es nur für die Bestellung der Artikel in Tabl2? Wenn ja, warum gibt es nicht nur eine Spalte für die Bestellung? –

+0

Tabelle1 stammt von der AzureML Recommendation-Engine. Ich habe keine Kontrolle darüber, wie die Daten ausgegeben werden. Für jeden Benutzer werden 10 empfohlene Elemente erstellt. Ich muss diese Empfehlungen auf dem Bildschirm basierend auf meiner Tabelle2 anzeigen. Item1 in Tabelle 1 ist die am meisten empfohlene und Item10 ist die am wenigsten empfohlene. Hoffe es klärt auf. – TimJohnson

+0

Ist das eine MachineLearning- oder TSQL-Frage? Warum hast du ML erwähnt? –

Antwort

1

Ich denke, dass Sie in diesem Fall ein umgekehrter Drehpunkt wollen.Sie nicht verwenden CASE, wie Sie es in einem normalen Dreh, sondern UNION ALL, wie folgt aus:

select Table1.UserId, Table2.ItemId, Table2.Name 
from Table1 inner join Table2 on Table1.Item1 = Table2.ItemId 
UNION ALL 
select Table1.UserId, Table2.ItemId, Table2.Name 
from Table1 inner join Table2 on Table1.Item2 = Table2.ItemId 
UNION ALL 
... 
select Table1.UserId, Table2.ItemId, Table2.Name 
from Table1 inner join Table2 on Table1.Item10 = Table2.ItemId 

Wenn Sie mehr Einzelteile haben, sollten Sie auch in der Lage sein, einen Code-Schnipsel zu schreiben, die sich wiederholende UNION ALL Syntax erzeugt Sie müssen also nicht alles von Hand eingeben.

0

A tabelle1 mit nur 3 Spalten

userid, itemid, sequence 

würde für Ihre Zwecke förderlich sein. Sie würden benötigt, um Ihre AzureML Ausgabe von der einzelnen Linie

Uid1, itm1,itm2,itm3,...,itm10 

in 10 Zeilen wie

Uid1, itm1, 1 
Uid1, itm2, 2 
Uid1, itm3, 3 
... 
Uid1, itm10,10 

Angenommen, Sie bekommen die obige Ausgangsleitung als (temporäre) Tabelle Ausgabe von AzureML mit Namen zu konvertieren tbla Sie könnten das follwing UNION ALL Konstrukt verwenden (wie von Spencer Simpson vorgeschlagen):

INSERT INTO table1 (userid, itemid, sequence) 
SELECT uid, itm1, 1 FROM tbla UNION ALL 
SELECT uid, itm2, 2 FROM tbla UNION ALL 
SELECT uid, itm3, 3 FROM tbla UNION ALL 
SELECT uid, itm4, 4 FROM tbla UNION ALL 
... 
SELECT uid, itm10, 10 FROM tbla 

die Informationen in 012.314 zu speichernist die einzige Tabelle, mit der Sie sich befassen müssen. No JOIN s wird nicht mehr benötigt.

Hinweis: Ich bin nicht ganz sicher, was Ihre Spalte name betrifft. Ist es der Name eines Artikels oder der Name eines Benutzers?

In beiden Fällen sollte es eine zweite Tabelle sein table2, die zwischen name und userid/itemid wie

itm/usr name 

Diese Tabelle dann Pflege der Korrespondenz nimmt join wird -ed in jede Abfrage, die die name Anzeige erfordert Spalte auch.

1

Da Sie SQL vollständig umgehen können, würde ich Ihnen dringend empfehlen, z. R oder Python, um Transaktionen in einer ML verwendbaren Weise zu verarbeiten. Das tidyr-Paket mit der Sammelfunktion macht genau das, was Sie tun möchten.

Eine andere Möglichkeit ist Kreuztabellen. Es ist absolut in Ordnung, eine Lösung mit dem SQL-Standard zu erstellen, aber viele Probleme können in R oder Python viel einfacher gelöst werden.

+0

Ich stimme zu, ich habe einen SQL-Writer im Moment, aber finde keine Dokumentation, wie die Sammelfunktion oder das Tidyr-Paket verwenden, so dass ich auf sql zurückgreifen, obwohl ich völlig zustimmen. – TimJohnson

0

Was ich getan habe, um dies zu umgehen, war Python (oder R) zu verwenden und die melt Funktion zu verwenden. Es gibt auch eine pivot_table Funktion im Dataframe.

So können Sie Ihre Spalten in Zeilen konvertiert werden. Fügen Sie dann diese Zeilen auf dem anderen Tisch hinzu.

Reshaping and Pivot Tables