我对 SQL 和数据库结构比较陌生,并且对解决此问题的最佳方法有疑问。
我有对象的历史变化数据,有时需要将其转换为特定日期的快照。
数据示例:
ID Value UpdateDate
1 4 2017-01-01
2 4 2017-01-03
3 4 2017-01-03
1 7 2017-01-04
2 5 2017-01-08
3 5 2017-01-10
2 8 2017-01-11
我希望能够在任何给定日期创建所有对象的完整概览的快照。例如:
Current Date: 2017-01-01 | Current Date: 2017-01-04
ID Value LastUpdateDate | ID Value LastUpdateDate
|
1 4 2017-01-01 | 1 7 2017-01-04
| 2 4 2017-01-03
| 3 4 2017-01-03
__________________________________________________________________________________
|
Current Date: 2017-01-08 | Current Date: 2017-01-12
ID Value LastUpdateDate | ID Value LastUpdateDate
|
1 7 2017-01-04 | 1 7 2017-01-04
2 5 2017-01-08 | 1 8 2017-01-10
3 4 2017-01-03 | 1 5 2017-01-11
我创建了以下 SQL 查询来创建这些表。但我想知道这是否是最“有效”的方法?实际上我的表非常大,有时每个对象类型有 200K-300K 唯一对象,每天有几千次更新(不是每个对象,但每天只有几千行添加到历史表中,所以它的大小正在增长迅速地)。
SQL查询:
SELECT * INTO @CurrentOverviewTableName
FROM @HistoryTableName
INNER JOIN (
SELECT ID AS ID_T, MAX(LastUpdateDate) AS LastUpdateDate
FROM @HistoryTableName
WHERE LastUpdateDate <= @OverviewDate
GROUP BY ID
) ts
ON S@HistoryTableName.ID = ts.ID_T AND @HistoryTableName.LastUpdateDate = ts.LastUpdateDate_T;
之后我得到这个例如:
ID Value LastUpdateDate ID_T LastUpdateDate_T
1 4 2017-01-01 1 2017-01-01
2 4 2017-01-03 2 2017-01-03
3 4 2017-01-03 3 2017-01-03
我删除了最后两列,因为它们是重复的,以获得我需要的东西。同样,这可行,但我想知道这是否是最好的方法?
我正在使用 Azure SQL DB。