按日期选择不同的前一条记录

Posted

技术标签:

【中文标题】按日期选择不同的前一条记录【英文标题】:Select Distinct Top One Record by Date 【发布时间】:2020-09-03 17:50:03 【问题描述】:

我正在编写一个脚本来比较服务器之间的软件,但有一个多对多的关系情况可以干净地执行它。我认为按最新日期类型的查询可能会有所帮助。这样我就可以从这里出发了

到这个简短而干净的列表

我不确定如何解决这个问题?我应该从排序开始,然后按日期区分顶部吗?

【问题讨论】:

【参考方案1】:

您也可以尝试使用row_number()

select * from
(
select *, row_number() over(partition by software_list order by date desc) as rn
from tablename
)A where rn=1

【讨论】:

【参考方案2】:

关联子查询怎么样?

select t.*
from t t2
where t.date = (select max(t2.date) from t t2 where t2.software_list = t.software_list);

【讨论】:

【参考方案3】:

这是使用 LAST_VALUE 的另一种方式。无需子查询即可工作

数据

drop table if exists #tTEST;
go
select * INTO #tTEST from (values 
('Software1', '1.0.0.1', '1900-01-01'),
('Software1', '1.1.1.1', '2020-03-04'),
('Software2', '3.2.2.1', '1900-01-01'),
('Software2', '3.3.3.1', '2020-03-04'),
('Software2', '4.5.0.0', '2020-05-07')) V(Software_List, [Version], [Date]);

查询

select distinct Software_List, 
       last_value([Version]) over (partition by Software_List order by [Date]
       rows between unbounded preceding and unbounded following) [Version],
       last_value([Date]) over (partition by Software_List order by [Date]
       rows between unbounded preceding and unbounded following) [Date]
from #tTEST t;

结果

Software_List   Version Date
Software1       1.1.1.1 2020-03-04
Software2       4.5.0.0 2020-05-07

【讨论】:

以上是关于按日期选择不同的前一条记录的主要内容,如果未能解决你的问题,请参考以下文章

选择按日期排序的每组的前 N ​​行

mysql怎么查询一条记录的前一条记录和后一条记录

如何使用同一组中下一行的数据更新前一条记录

Laravel 按日期获取以前的记录(优化)

选择日期和时间列的最后一条记录

选择每隔一条记录,然后确定最早的日期