Mam takie dane wejściowe: Start End 1 100 Chciałbym połączyć, aby podzielić każdy zakres na wiersze: ID 1 2 3 4 . . . 100 Próbuję uzyskać ten wynik w TERADACIE, czy możecie mi pomóc? Wielkie dzięki.

0
10k 15 czerwiec 2021, 13:42

2 odpowiedzi

Najlepsza odpowiedź

Jedną z metod jest rekurencyjne CTE:

with recursive cte (n, end) as (
      select start, end
      from t
      union all
      select n + 1, end
      from cte
      where n < end
     )
select n
from cte;

Uwaga: możesz dołączyć inne kolumny w cte, dzięki czemu możesz rozbić każdy wiersz i nadal mieć inne informacje, takie jak id lub cokolwiek innego.

0
Gordon Linoff 15 czerwiec 2021, 10:47

Zastrzeżona składnia EXPAND ON Teradata służy do tworzenia szeregów czasowych, ale może być również użyta do wykonania zadania.

Jeśli zakres identyfikatorów wynosi od 0 do 3 652 058, liczby te można bezpośrednio przekonwertować na DATE:

select t.*
   -- convert period back to int
  ,(last(pd)-date '0001-01-01') 
from mytable as t
expand on -- works on date/time only -> convert int to period
   period(date '0001-01-01' + start, date '0001-01-01' + (end + 1)) as pd

Jeśli identyfikatory są poza tym zakresem, ale łącznie mniej niż 3 652 058 identyfikatorów (liczba dni w kalendarzu Teradata, 9999 lat):

select dt.*
   -- convert period back to int
  ,start + (last(pd) - date '0001-01-01') as id
from
 (
   select t.*
      ,pd
   from mytable as t
   expand on -- works on date/time only -> convert int to period
      period(date '0001-01-01', date '0001-01-01' + (end - start +1)) as pd
 ) as dt

Musi być zagnieżdżony w tabeli pochodnej/CTE, ponieważ istnieją pewne ograniczenia, jakiego rodzaju obliczenia są dozwolone w rozszerzonych okresach.

Jeśli maksymalny zasięg wynosi ponad 3 652 058 identyfikatorów (mało prawdopodobne), będzie to trochę bardziej skomplikowane, ponieważ trzeba będzie przełączyć się na znaczniki czasu z dokładnością do mikrosekund, ale wtedy jest to praktycznie nieograniczone.

Uwaga, EXPAND ON nie powiedzie się, jeśli end < start, ale dodanie CASE naprawi to.

0
dnoeth 15 czerwiec 2021, 13:20