Tsql SQL。如何使用date扩展表?

Tsql SQL。如何使用date扩展表?,tsql,sql-server-2008,Tsql,Sql Server 2008,我使用SQL2008 我有一个逻辑实体表,比如数据,属性列有key、date、a、b、c、d 问题是a和b每天都在改变值,而c和d在随机日期改变值,而且速度非常慢。而且每个键都会单独改变。假设key=1的c,d将在今天和下个月发生变化,key=2的c,d将在明天和一周后发生变化 所以我的想法是在2号上分手。主数据键,日期,a,b和临时数据键,更改日期,c,d 然而,我没有编写一个有效的查询——如何使用它 我在想一个“参数化”的观点,不确定这是否可能。假设select*fromvwdata,其中d

我使用SQL2008

我有一个逻辑实体表,比如数据,属性列有key、date、a、b、c、d

问题是a和b每天都在改变值,而c和d在随机日期改变值,而且速度非常慢。而且每个键都会单独改变。假设key=1的c,d将在今天和下个月发生变化,key=2的c,d将在明天和一周后发生变化

所以我的想法是在2号上分手。主数据键,日期,a,b和临时数据键,更改日期,c,d

然而,我没有编写一个有效的查询——如何使用它

我在想一个“参数化”的观点,不确定这是否可能。假设select*fromvwdata,其中date='xxxxx',它将返回该特定日期的a,b以及对特定密钥和该日期有效的c,d

我需要一种简单明了的方法来从这个结构中选择数据。我还需要它是有效的,因为数据将在一年内巨大的时间

注意:只有选择where date=@singleDate never date介于

例如:

MainData             TemporalData
1 20101001 1.0 2.0   1 20101001 2.0 3.0
1 20101002 2.0 3.0   1 20101003 8.0 9.0
1 20101003 4.0 5.0   
1 20101004 6.0 3.0   

 select * from vwData where date = '20101002'

 1 20101002 2.0 3.0 2.0 3.0

 select * from vwData where date = '20101003'

 1 20101003 4.0 5.0 8.0 9.0

 select * from vwData where date = '20101004'

 1 20101004 6.0 3.0 8.0 9.0

首先,将数据拆分为1:1关系,一个表中有更多静态数据,另一个表中有经常更改的数据,这是一种不错的方法。其次,不清楚TemporalData.ChangeDate是否应该与MainDate.[Date]匹配。假设是这样,那么您可以这样做:

Select MainData.Key, MainData.[Date], MainData.a, MainData.b
    , TemporalData.c, TemporalData.d
From MainData
    Left Join TemporalData
        On TemporalData.Key = MainData.Key
            And TemporalData.ChangeDate = MainDate.[Date]
Where MainData.[Date] = @SomeDate
这假设您将始终具有MainData值,但可能没有TemporalData值。可以将其放在视图中,但不能指定参数。视图是一个虚拟表,因此表示一组无序的行。因此,您的观点如下所示:

Create View vwMain 
As
Select MainData.Key, MainData.[Date], MainData.a, MainData.b
    , TemporalData.c, TemporalData.d
From MainData
    Left Join TemporalData
        On TemporalData.Key = MainData.Key
            And TemporalData.ChangeDate = MainDate.[Date]
然后,您可以这样使用视图:

Select ...
From vwMain
Where [Date] = @SomeDate
编辑

看起来您想要的是始终有一个表示最近日期的临时数据行。虽然我们可以从您的评论和示例输出中推断出这一点,但从您的描述中并不清楚。因此,鉴于此,这里有一个解决方案。显然,最终结果不包括示例源数据的公共表表达式:

With MainData As
    (
    Select 1 As [Key], '20101001' As [Date], 1.0 As A, 2.0 As B
    Union All Select 1 As [Key], '20101002', 2.0, 3.0
    Union All Select 1 As [Key], '20101003', 4.0, 5.0
    Union All Select 1 As [Key], '20101004', 6.0, 3.0
    )
    , TemporalData As
    (
    Select 1 As [Key], '20101001' As [ChangeDate], 2.0 As C, 3.0 As D
    Union All Select 1 As [Key], '20101003', 8.0, 9.0
    )
    , RankedResults As
    (
    Select MainData.[Key], MainData.[Date], MainData.a, MainData.b
        , TemporalData.c, TemporalData.d, TemporalData.ChangeDate
        , Row_Number() Over ( Partition By MainData.[Key], MainData.[Date]
                          Order By TemporalData.ChangeDate Desc ) As Num
    From MainData
        Join TemporalData
            On TemporalData.Key = MainData.Key
               And TemporalData.ChangeDate <= MainData.[Date]
    )
Select *
From RankedResults
Where Num = 1
Order By [Date]

托马斯。整个问题是main.date将用于每天,但temporal.date将用于很少的日期,因此您的选择将为所有main.dates生成空值,除了那些是queal temporal.dates…@Bobb-不正确。我正在使用一个左连接到TemporalData。因此,我将从TemporalData.com中获取每个主数据行,并且仅获取匹配的行。我将获得日期,a,b,null,null,在密钥的ChangeDate之间的天内。。。。所以我应该怎样得到c和d?这就是问题的关键所在,以获取日期和时间的最新可用c和dKEY@Bobb-您在原始帖子中没有明确说明的是,您始终希望使用临时数据行。具体地说,如果没有与当前日期匹配的数据行,则为最后一个日期的时间数据行。@Bobb-您的描述中没有提到此要求。然而,我们可以从样本输出中推断出来。