дублирующие записи на основе пробелов между двумя столбцами - PullRequest
1 голос
/ 17 апреля 2020

У меня есть эти данные:

   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

Я пытаюсь сделайте это, подключившись по предложению, но пока не повезло. Может, у кого-то есть другая идея / подход?

Ответы [ 2 ]

0 голосов
/ 17 апреля 2020

Вы можете использовать рекурсивный CTE в Oracle. Синтаксис:

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;

Здесь является скриптом db <> для этого метода.

0 голосов
/ 17 апреля 2020

На SQL сервере вы можете использовать рекурсивный 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

Примечание: разные базы данных будут иметь разный синтаксис.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...