嗨,我有一个SQL问题,我试图在某个日期范围内获得每个人的月底记录。从本质上讲,我希望这个记录是跟踪历史(年价值的数据)使用某种月末记录,如果他们的开始和结束日期落在每个月的最后一天。所以目前的数据是这样的(为了简单起见,只使用2022年)…
Name | 起始日期 | 结束日期 | 约翰·史密斯 | 2022-01-15 | 2022-04-10 | Jane Doe
---|---|---|
2022-01-18 | 2022-03-05 | |
2022-03-07 | 2022-07-18 |
连接两个表应该会得到期望的结果。
您没有为初始表指定表名,因此,我将把它称为person
表。
您的calendar
表是一个很好的开始。我不认为你需要日期栏。只需要一个EndMonth列就足够了。
JOIN person against calendarWHERE EndMonth BETWEEN StartDate AND EndDate.
你完成了!
OP报告这工作正常:
SELECT P.Name, P.StartDate, P.EndDate, C.EndMonth
FROM PERSON P, CALENDAR C
WHERE EndMonth BETWEEN StartDate AND EndDate;
这正是Teradata专有的EXPAND ON语法的用途,不需要日历表:
SELECT
t.*
,pd -- EXPAND ON returns a period
,begin(pd) -- only show the start of the period
FROM records AS t
-- create a period on-the-fly, adjust the end date as periods exclude the end
EXPAND ON PERIOD(StartDate, Next(EndDate)) AS pd
BY ANCHOR MONTH_END -- return one row per month