Кому получить разницу между двумя идентификаторами в одной структуре - PullRequest
0 голосов
/ 22 марта 2019

У меня есть такая таблица:

id_begain | id_end | name | address | m_number
----------+--------+------+---------+-----------
1         | 5      | a    | hyd     | 099
7         | 9      | b    | pne     | 999
200       | 288    | c    | bng     | 1999

Мне нужен вывод, подобный этому:

id  name  address  m_number
----------------------------
1    a      hyd     099
2    a      hyd     099
3    a      hyd     099
4    a      hyd     099
5    a      hyd     099 
7    b      pne     999
8    b      pne     999
9    b      pne     999
200  c      bng     1999
201  c      bng     1999
... 
288  c      bng     1999

Ответы [ 2 ]

1 голос
/ 22 марта 2019

Вы можете использовать рекурсивное общее табличное выражение (tbl ваша таблица):

with cte as (
    select id_begin, id_end, name, address, m_number 
    from   tbl
    union all
    select id_begin+1, id_end, name, address, m_number
    from   cte
    where  id_begin < id_end
)
select   id_begin as id, name, address, m_number
from     cte
order by 1;
1 голос
/ 22 марта 2019

Это легко сделать, используя подход календарной таблицы, с CTE, содержащим последовательность всех чисел, которые могут появиться в вашем начальном или конечном столбцах:

WITH numbers AS (
    SELECT ones.n + 10*tens.n + 100*hundreds.n + 1000*thousands.n AS id
    FROM (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) ones(n),
         (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) tens(n),
         (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) hundreds(n),
         (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) thousands(n)
    WHERE ones.n + 10*tens.n + 100*hundreds.n + 1000*thousands.n BETWEEN 1 AND 10000
)

SELECT
    t1.id,
    t2.name,
    t2.address,
    t2.m_number
FROM numbers t1
INNER JOIN yourTable t2
    ON t1.id BETWEEN t2.id_begain AND t2.id_end
ORDER BY
    t1.id;
...