检索每条记录 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 的上一个日期的主要内容,如果未能解决你的问题,请参考以下文章
在 WHERE IN 子句 SQL 中显示每条记录的 MAX 日期
SQL Server - 随机随机播放结果,但为每条记录分配权重