太少时填充行-Netezza SQL

太少时填充行-Netezza SQL,sql,netezza,Sql,Netezza,我有一张包含客户、产品和等级的表格。该表处于客户产品级别,每个客户最多有5个产品。当产品少于5种时,我想从另一个表中填写数据,这样就有5种 原始表格: | Customer | Product | Rank | |----------|---------|------| | 123456 | 456 | 1 | | 123456 | 457 | 2 | | 123456 | 458 | 3 | | 234567 | 234 | 1

我有一张包含客户、产品和等级的表格。该表处于客户产品级别,每个客户最多有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    |

编辑:我应该提到我想先插入排名靠前的行。因此,对于客户123456,产品123应该排在第4位您可以使用
插入。选择

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;

太好了,谢谢!我应该提到我想先插入排名靠前的行。因此,对于客户123456,产品123应该排在第4位