Разбить ряд на несколько рядов - Teradata - PullRequest
0 голосов
/ 06 апреля 2020

Ниже приведен пример моей таблицы

Names   Start_Date   Orders    Items
AAA     2020-01-01   300       100
BAA     2020-02-01   896       448

Мое требование будет таким, как указано ниже

Names   Start_Date   Orders   
AAA     2020-01-01   100   
AAA     2020-01-01   100
AAA     2020-01-01   100
BBB     2020-02-01   448
BBB     2020-02-01   448

Строки должны быть разделены на основе значения (Заказы / Элементы)

Ответы [ 2 ]

2 голосов
/ 06 апреля 2020

Это хорошая задача для расширения SQL Teradata для создания временных рядов (на основе данных теста Эндрю):

SELECT *
FROM vt_foo
EXPAND ON PERIOD(start_date, start_date + Cast(Ceiling(Cast(orders AS FLOAT)/items) AS INT)) AS pd 

Для точного разделения заказов на элементы:

SELECT dt.*, 
   CASE WHEN items * (end_date - start_date) > orders 
        THEN orders MOD items
        ELSE items
   end
FROM
 (
   SELECT t.*, End(pd) AS end_date
   FROM vt_foo AS t
   EXPAND ON PERIOD(start_date, start_date + Cast(Ceiling(Cast(orders AS FLOAT)/items) AS INT)) AS pd 
 ) AS dt
1 голос
/ 06 апреля 2020

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

    create volatile table vt_foo
    (names varchar(100), start_date date, orders int, items int)
    on commit preserve rows;

    insert into vt_foo values ('AAA','2020-01-01',300,100);
    insert into vt_foo values ('BAA','2020-02-01',896,448);
    insert into vt_foo values ('CCC','2020-03-01',525,100);  -


    with recursive cte (names, start_date,items, num, counter) as (
    select
    names,
    start_date,
    items,
round(orders /( items * 1.0) ) as num ,
    1 as counter
    from vt_foo
    UNION ALL
    select
    a.names,
    a.start_date,
    a.items,
    b.num,
    b.counter + 1
    from vt_foo a
    inner join cte b 
    on a.names = b.names
    and a.start_date =b.start_date
    where b.counter + 1 <= b.num
    )
    select  * from cte
    order by names,start_date

Этот бит: b.counter + 1 <= b.num является ключом к ограничению вывода соответствующим количеством строк на продукт / дату ,

Я думаю, что все должно быть в порядке, но протестируйте его с небольшими объемами данных.

...