Sql查询从日期范围结果填充每日差距

时间:2018-01-11 16:38:36

标签: sql sql-server join grouping

我很难在SQL Server 2016上编写SQL查询。

我有一个表T_Values,每行包含一个日期和一个值。 日期不是每天连续(可能有差距)。 我想创建一个返回连续历史数据的查询,并在此差距上具有最后的已知值,如下所示:

日期



<table>
  <tr>
    <th>Date</th>
    <th>Value</th> 
  </tr>
  <tr>
    <td>01.01.2017</td>
    <td>100</td> 

  </tr>
  <tr>
    <td>03.01.2017</td>
    <td>105</td> 
  </tr>
    <tr>
    <td>05.01.2017</td>
    <td>109</td> 
  </tr>
</table>

<table>
  <tr>
    <th>Date</th>
    <th>Value</th> 
  </tr>
  <tr>
    <td>01.01.2017</td>
    <td>100</td> 
  </tr>
    <tr>
    <td>02.01.2017</td>
    <td>100</td> 
  </tr>
  <tr>
    <td>03.01.2017</td>
    <td>105</td> 
  </tr>
    <tr>
    <td>04.01.2017</td>
    <td>105</td> 
  </tr>
  <tr>
    <td>05.01.2017</td>
    <td>109</td> 
  </tr>
    <tr>
    <td>06.01.2017</td>
    <td>109</td> 
  </tr>
</table>
&#13;
&#13;
&#13;

我显然可以使用临时表,但我在这里寻找一个很好的解决方案。如果可能的话,我希望它尽可能简单并且具有良好的性能。

由于

1 个答案:

答案 0 :(得分:1)

可以通过OUTER APPLY和ad-hoc计数表

完成

示例

Select  [Date] = IsNull(B.D,A.Date)
       ,A.Value
 From  (
        Select *,D2 = lead(Date,1,Date) over (Order by Date) 
         from YourTable
       ) A
 Outer Apply (Select Top (DateDiff(DAY,A.Date,A.D2)) D=DateAdd(DAY,-1+Row_Number() Over (Order By (Select Null)),A.Date) From  master..spt_values n1 ) B

<强>返回

Date        Value
2017-01-01  100
2017-01-02  100
2017-01-03  105
2017-01-04  105
2017-01-05  109