我有一个关于LAG功能范围的问题。在我正在处理的特定示例中,我有一个类似于下表的表,尽管这非常简单:
ID Name ItemID VisitDate
----------- ---------------- ----------- ----------
316 Name,Test 9 2016-11-01
316 Name,Test 12 2016-11-01
316 Name,Test 89 2018-03-09
316 Name,Test 10 2018-03-09
316 Name,Test 1 2018-03-09我的目标是使用LAG有一个额外的列,显示当前VisitDate之前的最近一个an。所以我想看到的是
ID Name ItemID VisitDate LagDate
----------- ---------------- ----------- ---------- ----------
316 Name,Test 9 2016-11-01 NULL
316 Name,Test 12 2016-11-01 NULL
316 Name,Test 89 2018-03-09 2016-11-01
316 Name,Test 10 2018-03-09 2016-11-01
316 Name,Test 1 2018-03-09 2016-11-01但是,我还没能找到一种方法让表格以这种方式显示出来。最初,我编写了以下代码
SELECT
TT.ID
,TT.Name
,TT.ItemID
,TT.VisitDate
,LAG(TT.VisitDate) OVER ( PARTITION BY TT.ID ORDER BY TT.VisitDate ) AS LagDate
FROM
@TestTable AS TT;但是,这将返回下表:
ID Name ItemID VisitDate LagDate
----------- ---------------- ----------- ---------- ----------
316 Name,Test 9 2016-11-01 NULL
316 Name,Test 12 2016-11-01 2016-11-01
316 Name,Test 89 2018-03-09 2016-11-01
316 Name,Test 10 2018-03-09 2018-03-09
316 Name,Test 1 2018-03-09 2018-03-09就在那时,我意识到单个日期上的多个ItemID值给我带来了问题。那么,有没有人知道一种方法,我仍然可以在这个表上使用LAG,但是在每一行上获得我正在寻找的适当的LagDate?
发布于 2018-03-10 02:51:16
我使用密集等级得到了它:
declare @t table (id int, _name varchar(1000),ItemID int, visitDte date)
insert into @t
values
(316, 'Name,Test', 9 ,'2016-11-01')
,(316, 'Name,Test', 12 ,'2016-11-01')
,(316, 'Name,Test' , 89 ,'2018-03-09')
,(316, 'Name,Test', 10 ,'2018-03-09')
,(316, 'Name,Test', 1 ,'2018-03-09')
;with cte as
(
select *, dr= dense_rank() over (partition by ID order by visitDte) from @t
)
, CleanUp as (
select distinct ID, visitDte, dr
from cte)
select t.*
,Cleanup.visitDte PriorVisit
from cte t
left join CleanUp on t.id=CleanUp.id and t.dr-1=Cleanup.dr结果:
id _name ItemID visitDte dr PriorVisit
316 Name,Test 9 2016-11-01 1 NULL
316 Name,Test 12 2016-11-01 1 NULL
316 Name,Test 89 2018-03-09 2 2016-11-01
316 Name,Test 10 2018-03-09 2 2016-11-01
316 Name,Test 1 2018-03-09 2 2016-11-01https://stackoverflow.com/questions/49199989
复制相似问题