我很难在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;
我显然可以使用临时表,但我在这里寻找一个很好的解决方案。如果可能的话,我希望它尽可能简单并且具有良好的性能。
由于
答案 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