Повторение строк в зависимости от частоты - PullRequest
0 голосов
/ 28 марта 2019

У меня есть таблица с 2 столбцами с именами A и B, которая определяется как:

A   B
c1  2
c2  3
c3  4

Ожидаемый результат:

A     B
c1    1
c1    2  
c2    1
c2    2
c2    3
c3    1
c3    2
c3    3
c3    4

Ответы [ 4 ]

1 голос
/ 28 марта 2019
CREATE TABLE #table2
    ([A] varchar(2), [B] int)
;

INSERT INTO #table2
    ([A], [B])
VALUES
    ('c1', 2),
    ('c2', 3),
    ('c3', 4)

;WITH nums AS
       (SELECT 1 AS value ,a,b from #table2
        UNION ALL
        SELECT value + 1  AS value  ,A,b
        FROM nums
        WHERE nums.value <B)
    SELECT a,value
    FROM nums order by a,value

выход

a   value
c1  1
c1  2
c2  1
c2  2
c2  3
c3  1
c3  2
c3  3
c3  4
0 голосов
/ 28 марта 2019

Скажем, ваша таблица называется test.

WITH r(a, b, repeat) as 
(SELECT a, b, 1 from test
union all
select a, b, repeat+1 from  r
where r.repeat < r.b)
select * from r
ORDER BY a, repeat;
0 голосов
/ 28 марта 2019

Вы можете попробовать это:

// test data
declare @tbl table(A char(2),  B int);
insert into @tbl values
('c1',  2),
('c2',  3),
('c3',  4);
// create CTE with numbers which we will need to join
declare @max int;
select @max = max(B) from @tbl;
;with numbers as (
    select 1 n
    union all
    select n + 1 from numbers
    where n < @max
)
// join numbers with your table
select A, n from @tbl t
join numbers n on t.B >= n.n 
order by A, n
0 голосов
/ 28 марта 2019

Создана табличная функция, в которой я использовал Recursive cte для оценки повторяющихся значений заданных в пут. Затем соединяем таблицу с функцией с помощью Cross Apply

CREATE FUNCTION [dbo].[udf_GetData] (
    @Data INT
    )
RETURNS @output TABLE (
    Data INT

    )

BEGIN       
        ;WITH CTe
        AS
        (
            SELECT 1 As Data 
            UNION ALL
            SELECT Data+1
            FROM CTe
            WHERE Data < @Data
        )
        INSERT INTO @output
        SELECT Data FROM CTe

    RETURN
END

Пример данных и объяснение, как вызвать функцию с помощью CROSS APPLY

 DECLARE @Data AS TABLE (A VARCHAR(10),B INT)
    INSERT INTO @Data

    SELECT 'c1',  2 UNION ALL
    SELECT 'c2',  3 UNION ALL
    SELECT 'c3',  4

    SELECT d.A,
    (SELECT [dbo].[udf_GetData](d.B)) AS RecData
    FROM @Data d

Результат

A   RecursiveData
----------------
c1      1
c1      2
c2      1
c2      2
c2      3
c3      1
c3      2
c3      3
c3      4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...