代码之家  ›  专栏  ›  技术社区  ›  Boppity Bop

SQL语言。如何使用日期扩展表?

  •  -1
  • Boppity Bop  · 技术社区  · 14 年前

    我使用的是SQL 2008。

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

    所以我的想法是2分。主数据(key,date,a,b)和临时数据(key,changeDate,c,d)

    但是我没有写一个有效的查询-如何使用这个。

    我在想一个“参数化”的视图(不确定是否有可能)。假设select*from vwData where date='xxxxx',它将返回特定日期的a、b和对特定密钥和该日期有效的c、d。

    我需要一个简单明了的方法来从这个结构中选择数据。我也需要它的有效性,因为一年后数据会非常庞大

    (注意:只能选择日期=@singleDate never date between)

    例子:

    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 回复  |  直到 14 年前
        1
  •  1
  •   Thomas    14 年前

    首先,将一个表中的数据和另一个表中经常更改的数据分成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
    

    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]