检索每条记录 SQL Server 的上一个日期

Posted

技术标签:

【中文标题】检索每条记录 SQL Server 的上一个日期【英文标题】:Retrieve the previous date for each record SQL Server 【发布时间】:2015-07-29 18:50:57 【问题描述】:

我想检索每条记录的上一个客户合同生效日期。我如何编写一个查询,以便它会给我以下结果?这是针对 sql server 的。我是否使用超过partition by?谢谢!

Customer Eff_Date   Previous_Eff  
     A    1/1/2013    NULL   
     A    2/1/2014    1/1/2013   
     A    3/1/2015    2/1/2014    
     B    2/1/2014    NULL   
     B    3/1/2014    2/1/2014  

【问题讨论】:

您使用哪个版本的 SQL Server? 【参考方案1】:
select customer, eff_date,
lag(eff_date) over(partition by customer order by eff_date) as previous_eff
from tablename;

你可以使用lag函数来获取上一行的effdate的值。

如果您使用的是早于 2012 年的 SQL Server 版本,这是使用 row_number 函数的另一种方法。

with x as 
(select customer, eff_date,
row_number() over(partition by customer order by eff_date) as rn
from tablename)
select x.customer, x.eff_date, x1.eff_date as previous_eff
from x left join x x1 on x.customer = x1.customer
and x.rn = x1.rn + 1

SQL 小提琴:http://sqlfiddle.com/#!3/faf40/9

【讨论】:

LAG 从 SQL Server 2012 开始可用。 @HamletHakobyan..包括使用row_number的另一种方法 您的查询有 2 个错误。 @HamletHakobyan 谢谢!我刚发现我有 2008 版本,所以我不能使用延迟功能... @vkp 我对 x1.eff_date 有点困惑,不应该是 x.rn 吗?【参考方案2】:

这是一种使用子查询选择上一个日期的方法,该子查询适用于大多数 dbs

select *, 
    (select max(Eff_Date) from mytable b
    where b.Customer = a.Customer
    and b.Eff_Date < a.Eff_Date) Previous_Eff
from mytable a

【讨论】:

以上是关于检索每条记录 SQL Server 的上一个日期的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server:来自多行的最新属性集和日期

在 WHERE IN 子句 SQL 中显示每条记录的 MAX 日期

SQL Server - 随机随机播放结果,但为每条记录分配权重

SQL Server 日期查询,年月作为单独的列

使用 VB.NET 表单从 SQL Server 到 Excel 的日期数据检索

批量从 SQL Server 检索数据