问题描述
假设我有一张表(“ 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 |
+------+------+
解决方法
以下方法应该起作用:
- 创建序列表
- 在此序列表上加入新表,以确保正确的固定位置
- “重新计数”空行
- 将旧表加入此新列
以下查询应给出期望的结果:
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;