【问题标题】:Presto SQL - Fill in missing values within range with 0Presto SQL - 用0填充范围内的缺失值
【发布时间】:2020-04-06 04:03:26
【问题描述】:

这是初始表:

id range val
1  -4.   2
1  -2.   1
1. 1.    1
1  3.    2
1  4.    1
2. -1.   1
2. 0.    1
2. 1.    1

更新表:

id range val
1  -4.   2
1. -3.   0
1  -2.   1
1. -1.   0
1. 0.    0
1. 1.    1
1. 2.    0
1  3.    2
1  4.    1
2. -1.   1
2. 0.    1
2. 1.    1
2. 2.    0
2  3.    0
2  4.    0

所需逻辑:

  • 每个id 都有一定的范围。
  • 对于每个id,范围的下限会有所不同,但上限将是整个表中的最大值。
  • 对于该 id 更新范围内的任何缺失值,它将被归为 0

我不是 SQL 专家,所以我有点迷茫。任何帮助将非常感激。如果逻辑上有什么令人困惑的地方,请告诉我。

【问题讨论】:

    标签: sql presto


    【解决方案1】:

    如果对于每个范围值,您至少有一个值,那么我认为您想要:

    select i.id, t.range, coalesce(t.value, 0) as value
    from (select distinct id from t) i cross join
         (select distinct range from t where range > 0) r left join
         t
         on t.id = i.id and t.range = r.range
    union all
    select id, range, value
    from t
    where range <= 0;
    

    这是如何工作的?第一个子查询生成 id 和范围值的所有组合,其中范围值大于 0。它使用不同的 id 和 range 值的笛卡尔积来执行此操作。

    LEFT JOIN 然后引入现有数据。最后的子查询会带来碎屑——小于 0 的值。

    【讨论】:

    • 我一定会试试这个。对于没有大量 SQL 经验的人,您能解释一下代码中的逻辑吗?我认为它对其他人也有帮助。
    • 应该改成t.range = r.range吗?
    猜你喜欢
    • 2021-09-30
    • 1970-01-01
    • 2011-04-02
    • 2017-07-09
    • 2021-03-19
    • 1970-01-01
    • 2016-02-09
    • 2015-10-19
    • 1970-01-01
    相关资源
    最近更新 更多