基于两列之间的间隙重复记录
Posted
技术标签:
【中文标题】基于两列之间的间隙重复记录【英文标题】:dupliacte records based on gaps bettwen two columns 【发布时间】:2020-04-17 10:15:06 【问题描述】:我有这些数据:
rn sex value from to
1 w 0.019500000000000000 1 25
2 w 0.018000000000000002 26 26
3 w 0.019500000000000000 27 28
4 w 0.021000000000000001 29 29
5 w 0.022500000000000002 30 30
6 w 0.024000000000000000 31 31
7 w 0.025500000000000001 32 32
8 w 0.026999999999999999 33 33
9 w 0.028500000000000001 34 34
10 w 0.029999999999999998 35 35
11 w 0.031500000000000000 36 36
12 w 0.034500000000000002 37 37
13 w 0.036000000000000004 38 38
我想根据从到之间的间隔复制记录 所以上面的数据应该是这样的: 25
1 w 0.019500000000000000 1
1 w 0.019500000000000000 2
1 w 0.019500000000000000 3
1 w 0.019500000000000000 4
1 w 0.019500000000000000 5
1 w 0.019500000000000000 6
1 w 0.019500000000000000 7
1 w 0.019500000000000000 8
1 w 0.019500000000000000 9
1 w 0.019500000000000000 10
1 w 0.019500000000000000 11
1 w 0.019500000000000000 12
1 w 0.019500000000000000 13
1 w 0.019500000000000000 14
1 w 0.019500000000000000 15
1 w 0.019500000000000000 16
1 w 0.019500000000000000 17
1 w 0.019500000000000000 18
1 w 0.019500000000000000 19
1 w 0.019500000000000000 20
1 w 0.019500000000000000 21
1 w 0.019500000000000000 22
1 w 0.019500000000000000 23
1 w 0.019500000000000000 24
1 w 0.019500000000000000 25
2 w 0.018000000000000002 26
3 w 0.019500000000000000 27
3 w 0.019500000000000000 28
我试图通过 connect by 子句来做到这一点,但现在没有运气。 也许有人有不同的想法/方法?
【问题讨论】:
标记您正在使用的 DBMS。 标签已编辑 - 12c 【参考方案1】:您可以在 Oracle 中使用递归 CTE。语法是:
with recursive r_cte(rn, sex, value, from, to) as (
select rn, sex, value, from, to
from t
union all
select rn, sex, value, from + 1, to
from r_cte r
where from < to
)
select rn, sex, value, from
from r_cte
order by rn, from;
当然,from
和 to
是糟糕的列名——因为它们是 SQL 关键字。如果是真名,应该转义。
更传统的方法是生成一个数字列表,然后使用这些:
with n as (
select level - 1 as n
from (select max(t - f + 1) as range
from t
) t
connect by level <= range
)
select rn, sex, value, f + n
from t join
n
on n <= (t - f)
order by rn, f + n;
Here 是这个方法的一个 dbfiddle。
【讨论】:
我将列重命名为问题以便更清楚。在 DB 上,它们有不同的名称。谢谢:)【参考方案2】:在 SQL Server 中你可以使用递归 cte :
with r_cte (rn, sex, value, from, to) as (
select rn, sex, value, from, to
from table t
union all
select rn, sex, value, from + 1, to
from r_cte r
where from < to
)
select rn, sex, value, from
from r_cte
order by rn, from
option (maxrecursion 0); -- remove this for oracle
注意:不同的数据库会有不同的语法。
【讨论】:
:) 谢谢,但我的意思是 Oracle,在标签中可见以上是关于基于两列之间的间隙重复记录的主要内容,如果未能解决你的问题,请参考以下文章