这是初始表:
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
,范围的下限将有所不同,但上限将是整个表格中的最大值。我不是SQL向导,所以我有点迷路。任何帮助将非常感激。让我知道是否对逻辑感到困惑。
答案 0 :(得分:0)
如果对于每个范围值,您至少都有一个值,那么我认为您想要:
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的值。