基于两列之间的间隙重复记录

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;

当然,fromto 是糟糕的列名——因为它们是 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,在标签中可见

以上是关于基于两列之间的间隙重复记录的主要内容,如果未能解决你的问题,请参考以下文章

将其基于重复记录的两列组合组合在一起创建记录,并分配 Min start_date 和 Max end_date

mysql 解决可提交读、可重复读、幻读

根据两列重复值找出唯一的***记录[重复]

SQL 根据两列删除重复记录

mysql间隙锁

mysql间隙锁