历史记录表上的SQL语句

时间:2020-05-06 14:29:22

标签: sql sql-server

我一直在寻找答案,但没有找到答案,而且可能没有答案。
我有一个历史记录,可以将更改记录到另一个表中。

示例

RecordId | mainTID | DateAdded | V1 |  V2 | V3 <br>
1 | 1 | 1/1/2020 | 1 | 1 | 1<br>
2 | 1 | 1/2/2020 | 0 | 1 | 1<br>
3 | 1 | 2/1/2020 | 0 | 2 | 0<br>
4 | 1 | 2/2/2020 | 0 | 0 | 2<br>
5 | 2 | 1/1/2020 | 2 | 1 | 1<br>
6 | 2 | 1/5/2020 | 2 | 2 | 2<br>
7 | 2 | 1/7/2020 | 1 | 2 | 0<br>
8 | 2 | 2/8/2020 | 2 | 2 | 2<br>
9 | 3 | 1/5/2020 | 0 | 1 | 1<br>

我需要通过日期范围获取此数据,但是我只想要每个mainTID的最后一条记录。例如,如果我对1/1/2020到1/7/2020进行查询,则会得到

RecordId | mainTID | DateAdded | V1 |  V2 | V3 <br>
2 | 1 | 1/2/2020 | 0 | 1 | 1<br>
7 | 2 | 1/7/2020 | 1 | 2 | 0<br>
9 | 3 | 1/5/2020 | 0 | 1 | 1<br>

最终目标是对值列进行计数,所以我会得到

Counts  | V1 |  V2 | V3 <br>
2 | 0 | 1 | 1<br>
1 | 1 | 2 | 0<br> 

我需要通过日期范围获取此数据,但是我只想要每个mainTID的最后一条记录。例如,如果我对2020年1月1日至2020年2月8日进行查询,我会得到

RecordId | mainTID | DateAdded | V1 |  V2 | V3 <br>
4 | 1 | 2/2/2020 | 0 | 0 | 2<br>
8 | 2 | 2/8/2020 | 2 | 2 | 2<br>
9 | 3 | 1/5/2020 | 0 | 1 | 1<br>

再次目标是对值列的计数,这样我就可以得到

Counts  | V1 |  V2 | V3 <br>
1 | 0 | 0 | 1<br>
1 | 2 | 2 | 2<br> 
1 | 0 | 1 | 1<br> 

是否有一种方法可以通过1条SQL语句获得这些结果:仅供参考:我正在使用MSSQL 2019,如果这样做会有所作为

谢谢

1 个答案:

答案 0 :(得分:0)

如果我理解正确,则可以使用相关的子查询:

select t.*
from t
where t.dateadded = (select max(t2.dateadded)
                     from t t2
                     where t2.mainTID = t.mainTID and
                           t2.dateadded between @date1 and @date2
                    );
相关问题