【问题标题】:How do I join a sparse table and fill rows between in SQL Server如何在 SQL Server 中加入稀疏表并填充行
【发布时间】:2020-02-10 16:16:02
【问题描述】:

如何将一个表中的权重应用到另一个 [Port] weight 表具有稀疏日期的表?

[Port]

    utcDT                   UsdPnl
   -----------------------------------------------
    2012-03-09 00:00:00.000 -0.00581815226439161
    2012-03-11 00:00:00.000 -0.000535272460588547
    2012-03-12 00:00:00.000 -0.00353079778650661
    2012-03-13 00:00:00.000 0.00232882689252497
    2012-03-14 00:00:00.000 -0.0102592811199384
    2012-03-15 00:00:00.000 0.00254451559598693
    2012-03-16 00:00:00.000 0.0146718613139845
    2012-03-18 00:00:00.000 0.000425144543842752
    2012-03-19 00:00:00.000 -0.00388548271428044
    2012-03-20 00:00:00.000 -0.00662423680184768
    2012-03-21 00:00:00.000 0.00405506208635343
    2012-03-22 00:00:00.000 -0.000814822806982203
    2012-03-23 00:00:00.000 -0.00289523953346103
    2012-03-25 00:00:00.000 0.00204150859774465
    2012-03-26 00:00:00.000 -0.00641635182718787
    2012-03-27 00:00:00.000 -0.00107168420738448
    2012-03-28 00:00:00.000 0.00131000520696153
    2012-03-29 00:00:00.000 0.0008223678402638
    2012-03-30 00:00:00.000 -0.00255345945390133
    2012-04-01 00:00:00.000 -0.00337792814650089

[Weights]

utcDT                     Weight
--------------------------------
2012-03-09 00:00:00.000     1
2012-03-20 00:00:00.000     3
2012-03-29 00:00:00.000     7

所以,我想使用权重,就好像我有一个像下面这样的完整表格。即在第一天更改为新的重量,它出现在 [Weights] 表中:

    utcDT                   UsedWeight   
    ----------------------------------
    2012-03-09 00:00:00.000     1
    2012-03-11 00:00:00.000     1
    2012-03-12 00:00:00.000     1
    2012-03-13 00:00:00.000     1
    2012-03-14 00:00:00.000     1
    2012-03-15 00:00:00.000     1
    2012-03-16 00:00:00.000     1
    2012-03-18 00:00:00.000     1
    2012-03-19 00:00:00.000     1
    2012-03-20 00:00:00.000     3
    2012-03-21 00:00:00.000     3
    2012-03-22 00:00:00.000     3
    2012-03-23 00:00:00.000     3
    2012-03-25 00:00:00.000     3
    2012-03-26 00:00:00.000     3
    2012-03-27 00:00:00.000     3
    2012-03-28 00:00:00.000     3
    2012-03-29 00:00:00.000     7
    2012-03-30 00:00:00.000     7
    2012-04-01 00:00:00.000     7

【问题讨论】:

    标签: sql sql-server tsql date


    【解决方案1】:

    你可以使用apply:

    select p.*, w.*
    from port p outer apply
         (select top (1) w.*
          from weights w
          where w.utcDT <= p.utcDT
          order by w.utcDT desc
         ) w;
    

    outer apply 通常非常有效,如果你有正确的索引。在这种情况下,正确的 inex 位于 weights(utcDT desc)

    【讨论】:

      【解决方案2】:

      您可以在子查询中使用lead()下一个 日期权重更改关联到每个weights 记录,然后使用日期上的不等式条件与port 连接:

      select p.utcDt, w.weight
      from port p
      inner join (
          select utcDt, weight, lead(utcDt) over(order by utcDt) lead_utcDt from weights
      ) w 
          on p.utcDt >= w.utcDt 
          and (w.lead_utcDt is null or p.utcDt < w.lead_utcDt)
      

      【讨论】:

        猜你喜欢
        • 2021-12-11
        • 1970-01-01
        • 1970-01-01
        • 2012-07-28
        • 1970-01-01
        • 2017-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多