根据固定排名合并表格

问题描述

假设我有一张表(“ OldTable”),该表具有连续的项目等级,则thas是预先计算的,从1开始一直到某个数字。 我有一个新表(“ NewTable”),该表具有一些不连续的,不是从0开始的排名(例如,值3和5)。没有项目重复,并且另一个表中不存在。

我希望将它们合并成一个表,同时将NewTable项目保持在固定位置,并相应地调整旧表的排名。

例如

OldTable
+------+------+
| item | rank |
+------+------+
| o1   |    1 |
| o2   |    2 |
| o3   |    3 |
| o4   |    4 |
| o5   |    5 |
+------+------+

NewTable
+------+------+
| item | rank |
+------+------+
| n1   |    3 |
| n2   |    5 |
+------+------+

Output Table
+------+------+
| item | rank |
+------+------+
| o1   |    1 |
| o2   |    2 |
| n1   |    3 |
| o3   |    4 |
| n2   |    5 |
| o4   |    6 |
| o5   |    7 |
+------+------+

解决方法

以下方法应该起作用:

  1. 创建序列表
  2. 在此序列表上加入新表,以确保正确的固定位置
  3. “重新计数”空行
  4. 将旧表加入此新列

以下查询应给出期望的结果:

with old_values as
(
    SELECT * FROM (
        VALUES
            ('o1',1),('o2',2),('o3',3),('o4',4),('o5',5)
    ) AS t (id,rnk)
),new_values as
(
    SELECT * FROM (
        VALUES
            ('n1',('n2',total_ranks as
(
    select x from unnest(sequence(1,7)) t(x) 
),fixed_new_rank as
(
    select *,case when nv.rnk is null then tr.x-COUNT(nv.rnk)OVER(order by tr.x) else null end empty_rnk
    from total_ranks tr
    left join new_values nv
        on tr.x = nv.rnk
)
select fnr.x,coalesce(fnr.id,ov.id) id
from fixed_new_rank fnr
left join old_values ov
    on fnr.empty_rnk = ov.rnk
order by x;