【问题标题】:Combine tables based on fixed rank根据固定排名组合表格
【发布时间】:2020-09-30 15:46:20
【问题描述】:

假设我有一个表(“OldTable”),其中包含连续的项目排名,这是预先计算的,从 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 |
+------+------+

【问题讨论】:

    标签: sql union presto rank


    【解决方案1】:

    以下应该有效:

    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', 3),
                ('n2', 5)
        ) AS t (id, rnk)
    )
    ,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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-03
      • 2015-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多