当太少时填充行 - Netezza SQL

时间:2016-04-20 18:45:49

标签: sql netezza

我有一张包含客户,产品和广告的表格。秩。该表位于客户 - 产品级别,每个客户最多有5个产品。当我的产品少于5个时,我想从另一个表中填写数据,所以有5个。

原始表:

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

结果我正在寻找:

| 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的排名4

1 个答案:

答案 0 :(得分:1)

您可以使用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;