问题
我有一个如下所示的起始表:
我正在尝试编写一个 SQL 查询,该查询将把这些数据写入一个类似格式的表中,但带有额外的装饰,表明记录何时过期以及哪些记录处于活动状态。结果将如下所示:
identifier | loaddate | loadenddate | activeflag | symbol
723a90699e99ec9e00216910910384bd | 2020-04-01 | 2020-04-07 | 0 | DXB
723a90699e99ec9e00216910910384bd | 2020-04-08 | 2999-12-31 | 1 | DXB CL
请注意,有 1000 种不同的标识符,其中一些在各种不同的时间范围内具有一个、两个、三个 + 不同的符号。
要求
- 任何时候第一次看到标识符时,都必须在最终表中创建它,并将今天的日期作为加载日期,并且加载日期为 2999-12-31,并且 activeflag=1
- 在第二天看到该标识符时,仅在符号已更改时才添加一行。如果有,则通过将前一行的 loadenddate 设置为此新行的 loaddate - 1 天和 activeflag = 0 来使前一行“过期”
- sql 查询(或多个查询)还需要能够每天在源表上重新运行,以便它们正确处理目标表中的现有数据以及目标表为空白(初始运行)
到目前为止我得到了什么
要最初加载(而不是重复),我有以下 SQL:
INSERT INTO finaltable(
listinghashkey
symbol,
loaddate,
loadenddate,
activeflag
)
SELECT
s.listinghashkey
s.symbol,
MAX(s.loaddate),
'2999-12-31 00:00:00.0',
1
FROM
startingtable s
LEFT JOIN finaltable f ON s.listinghashkey = f.listinghashkey
WHERE (f.listinghashkey IS NULL)
GROUP BY s.listinghashkey, s.symbol