sql - T-SQL通过RelevanceDate从表/log_table中检索历史数据

标签 sql sql-server tsql

我有以下表格:

1) TBL (ID, Data, LastUpdated, DateCreated)
2) TBL_LOG(Log_ID, LogCreateDate, ID, Data, LastUpdated, DateCreated)


TBL用于存储当前数据,而TBL_LOG用于存储数据在TBL中的每一次更改(使用更新触发器,将从TBL删除的记录复制到TBL_LOG)。

现在,我需要按相关日期检索数据。
如何编写表值函数(或其他替代方法),该函数将根据RelevanceDate返回数据。

我了解逻辑,但找不到用SQL编写的好方法...
逻辑看起来像:

@RelevanceDate = '2011-03-01'
IF TBL.LastUpdated <= @RelevanceDate THEN return data from TBL
ELSE IF Exists data in TBL_LOG where TBL_LOG.LastUpdated <= @RelevanceDate 
    THEN return most resent data from TBL_LOG where TBL_LOG.LastUpdated <= @RelevanceDate
ELSE IF Exists data in TBL_LOG where TBL_LOG.LastUpdated > @RelevanceDate 
    THEN return the oldest data from TBL_LOG.LastUpdated > @RelevanceDate
ELSE return data from TBL


对于TBL中的所有记录,此函数应使用上述逻辑返回数据。

简而言之,对于TBL中的每一行,我都需要“ RelevanceDate”上的数据。

最佳答案

在调查结束时,我最终遇到了以下问题:

DECLARE @RelevanceDate DATETIME
SET @RelevanceDate = '2012-03-01'

SELECT 
        MainData.ID, MainData.Data, MainData.LastUpdated, MainData.DateCreated
FROM   (
           SELECT 
                  *
                  ,ROW_NUMBER() OVER(PARTITION BY AllData.ID, AllData.RowNum ORDER BY AllData.LastUpdated) AS MainRowNumber
           FROM   (
                      --Current Data
                      SELECT 
                             NULL LogID
                            ,NULL LogCreateDate
                            ,*
                            ,ROW_NUMBER() OVER(PARTITION BY ID ORDER BY LastUpdated DESC) AS RowNum
                      FROM   TBL
                      WHERE  (lastupdate<=@RelevanceDate)

                      UNION

                      --History Data
                      SELECT  
                            *
                            ,ROW_NUMBER() OVER(PARTITION BY ID ORDER BY LastUpdated) AS RowNum
                      FROM   TBL_LOG
                      WHERE  lastupdate>@RelevanceDate
                  ) AllData WHERE AllData.RowNum=1
       ) MainData
WHERE  MainData.MainRowNumber = 1


如果有人对如何更好地提出建议,我将很高兴看到它:)

关于sql - T-SQL通过RelevanceDate从表/log_table中检索历史数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9770921/

相关文章:

sql - Linq to SQL - View 与存储过程

c# - 如何防止 SQL 数据库中的相似(重复)条目?

SQL IF EXISTS 带 OR 条件

sql - T-SQL 平均值四舍五入到最接近的整数

sql - 如何将单个列值拆分为多个列值?

php - SELECT 列中的最后一个值始终为 null 或 false SQL

sql - SQL Server 中按日期计算平均值的新列

sql - 如何仅按特定列值的前几个字母对 SQL 查询进行分组?

SQL 服务器 : How to select rows that were inserted on the same day?

sql - SSIS/SQL Server - 处理各种货币类型符号