2016-04-20 68 views
1

我有一張客戶,產品,&等級的表格。該表格處於客戶產品級別,每位客戶最多可擁有5種產品。當有小於5級的產品,我想從另一個表中的數據來填充所以有5行數太少時填充 - Netezza SQL

原始表:

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

填寫表:

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

結果我m尋找:

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

編輯:我應該提到我想插入排名第一的行。所以,產品123應該是客戶123456

回答

1

4級你可以用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; 

您可以運行子查詢,以獲得缺失值。

這個想法是生成「填充」的所有可能的組合。然後刪除那些已經有值的地方。

編輯:

哎呀,我還以爲排名在表格填充是最後的排名。但你仍然可以這樣做:

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

這太棒了,謝謝!我應該提到我想要插入排名第一的行。因此,產品123應該爲顧客123456排名第4 – Adam12344