2016-04-20 9 views
1

Ich habe eine Tabelle mit Kunde, Produkt, & Rang. Die Tabelle befindet sich auf Kunden-Produkt-Ebene und hat für jeden Kunden bis zu 5 Produkte. Wenn es weniger als 5 Produkte würde Ich mag in Daten aus einer anderen Tabelle zu füllen, so 5. gibt esFüllen von Zeilen, wenn zu wenig - Netezza SQL

Original-Tabelle:

| Customer | Product | Rank | 
|----------|---------|------| 
| 123456 | 456  | 1 | 
| 123456 | 457  | 2 | 
| 123456 | 458  | 3 | 
| 234567 | 234  | 1 | 
| 234567 | 235  | 2 | 
| 234567 | 236  | 3 | 
| 234567 | 237  | 4 | 
| 234567 | 238  | 5 | 
| 345678 | 712  | 1 | 
| 345678 | 713  | 2 | 

Fill in der Tabelle:

| Product | Rank | 
|---------|------| 
| 123  | 1 | 
| 124  | 2 | 
| 125  | 3 | 
| 126  | 4 | 
| 127  | 5 | 

Ergebnisse I‘ m Suchen nach:

| Customer | Product | Rank | 
|----------|---------|------| 
| 123456 | 456  | 1 | 
| 123456 | 457  | 2 | 
| 123456 | 458  | 3 | 
| 123456 | 123  | 4 | 
| 123456 | 124  | 5 | 
| 234567 | 234  | 1 | 
| 234567 | 235  | 2 | 
| 234567 | 236  | 3 | 
| 234567 | 237  | 4 | 
| 234567 | 238  | 5 | 
| 345678 | 712  | 1 | 
| 345678 | 713  | 2 | 
| 345678 | 123  | 3 | 
| 345678 | 124  | 4 | 
| 345678 | 125  | 5 | 

edit: Ich hätte erwähnen sollen, dass ich die oberste Reihe zuerst eingefügt werden wollte. So sollte 123 Produkt seinen Rang 4 für Kunden 123456

Antwort

1

Sie können dies tun mit insert . . . select:

insert into original(customer, product, rank) 
    select c.customer, f.product, f.rank 
    from (select distinct customer from original) c cross join 
     fillin f left join 
     original o 
     on o.customer = c.customer and o.rank = f.rank 
    where o.rank is null; 

Sie die Unterabfrage ausführen kann die fehlende Werte zu erhalten.

Die Idee ist es, alle möglichen Kombinationen von "Fill Ins" zu generieren. Entferne dann diejenigen, wo bereits ein Wert ist.

EDIT:

Hoppla, dachte ich, das Ranking in der Füllung in der Tabelle war die endgültige Platzierung. Aber du kannst das immer noch tun:

insert into original(customer, product, rank) 
    select c.customer, f.product, f.rank 
    from (select customer, max(rank) as maxrank from original) c cross join 
     fillin f left join 
     original o 
     on o.customer = c.customer and o.rank - o.maxrank + 1 = f.rank; 
+0

Das ist toll, danke! Ich hätte erwähnen sollen, dass ich die erste Zeile als erste Zeile einfügen wollte. Das Produkt 123 sollte daher für den Kunden 123456 auf Platz 4 stehen – Adam12344

Verwandte Themen