我正在尝试重写具有产品连接的查询,以使用 EXPAND ON 函数在日期期间扩展记录。这是它目前的工作方式。
SELECT
t1.key
,MIN(t1.beg_dt)
,MAX(t1.end_dt)
,dates.end_month_dt
FROM t1
INNER JOIN dates
ON t1.beg_dt < dates.end_month_dt
AND t1.end_dt >= dates.end_month_dt
GROUP BY 1,4;
日期表只是一堆日期信息的列表。end_month_dt 是一个列,它的每个月末日期都可以追溯到几年前。(例如 1/31/13、2/28/31、3/31/13 等...)
如果 t1 中的记录具有 beg_dt = 1/1/13 和 end_dt = 8/31/13,则此联接将在此时间间隔内为每个月创建一条记录。像这样:
key beg_dt end_dt end_month_dt
1 1/1/13 8/31/13 1/31/13
1 1/1/13 8/31/13 2/28/13
...
1 1/1/13 8/31/13 8/31/13
此查询运行不佳,必须分成几个部分,因为它包含来自 t1 的更多信息并且跨越数年。我发现 EXPAND ON 可以产生非常相似的结果,但是我在将最后一个月(或第一个月)包含在内时遇到了一个小问题。这是我所拥有的:
SELECT
t1.key
,t1.beg_dt
,t1.end_dt
,BEGIN(prd) as end_month_dt
FROM t1
EXPAND ON PERIOD(t1.beg_dt, t1.end_dt) AS prd BY ANCHOR MONTH_END;
除了不包括最后一行之外,这会产生相同的结果。如果我使用 END(prd),它将排除第一行。问题似乎是 prd = (1/1/13, 8/31/13) 以及何时扩大回报
prd
(1/31/13, 2/28/13)
(2/28/13, 3/31/13)
...
(7/31/13, 8/31/13)
我真正需要的是每个时期左侧(1/31 - 7/31)的所有日期的 t1 信息,然后是右侧的最后一个日期(8/31)。有没有另一种方法可以让我在 EXPAND ON 上写出这样的结果?
编辑:我发现调整 beg_dt 和 end_dt 可以让我得到相同的结果,尽管功能比我通常想要的要多。它似乎仍在运行,并且仍然比原来的要快得多。
SELECT
t1.key
,t1.beg_dt
,t1.end_dt
,BEGIN(prd) as end_month_dt
FROM t1
EXPAND ON PERIOD(
CASE
WHEN beg_dt = Last_Day(beg_dt) THEN beg_dt + 1
ELSE beg_dt
END
,CASE
WHEN end_dt = '9999-12-31' THEN end_dt
ELSE end_dt + 1
END) AS prd BY ANCHOR Month_End