SQL лучший способ получить запись за каждый месяц с даты начала и окончания - PullRequest
0 голосов
/ 21 января 2020

У меня есть большая таблица с start_dt и end_dt для каждой строки, и я хочу добавить строку для каждого года и месяца, в котором эта строка присутствует. Так что, если запись была с марта по июнь 2019 года, я хотел бы иметь 4 строки, по одной на каждый месяц, в котором она находилась. Как лучше всего это сделать? Спасибо

Так из этого enter image description here

этому enter image description here

Ответы [ 3 ]

2 голосов
/ 22 января 2020

Teradata имеет собственный синтаксис для создания временных рядов:

SELECT mytab.*, pd
  - extract the begin of the period and split it in YEAR/MONTH 
  ,To_Char(Begin(pd), 'MONTH')
  ,Extract(YEAR From Begin(pd))
FROM mytab
EXPAND ON PERIOD(start_dt, Last_Day(end_dt)) AS pd -- must be LAST_DAY to include the end month
       BY ANCHOR PERIOD Month_Begin -- one row for each month
1 голос
/ 24 января 2020

Вы можете попробовать это также с названиями месяцев:

SELECT DISTINCT
T.ID AS REC_ID
,TO_CHAR(C.CALENDAR_DATE, 'Month') AS MONTH_PRESE
,C.YEAR_OF_CALENDAR AS YEAR_PRESE
FROM
<target_tablename> AS F
INNER JOIN SYS_CALENDAR.CALENDAR AS C
    ON C.CALENDAR_DATE BETWEEN F.START_DATE AND F.END_DATE
ORDER BY ID, MONTH_OF_YEAR;
1 голос
/ 22 января 2020

Для этого вы можете использовать представление календаря. Вот простой пример:

select
distinct f.id,
c.month_of_year,
c.year_of_calendar
from
vt_foo f
inner join sys_calendar.calendar c
    on c.calendar_date between f.start_dt and f.end_dt
order by id,month_of_year
...