首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用LAG函数获取不一定在前一行中的值

使用LAG函数获取不一定在前一行中的值
EN

Stack Overflow用户
提问于 2018-03-10 02:27:50
回答 4查看 2.4K关注 0票数 1

我有一个关于LAG功能范围的问题。在我正在处理的特定示例中,我有一个类似于下表的表,尽管这非常简单:

代码语言:javascript
运行
复制
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。所以我想看到的是

代码语言:javascript
运行
复制
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

但是,我还没能找到一种方法让表格以这种方式显示出来。最初,我编写了以下代码

代码语言:javascript
运行
复制
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;

但是,这将返回下表:

代码语言:javascript
运行
复制
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?

EN

回答 4

Stack Overflow用户

发布于 2018-03-10 02:40:52

我看不到使用窗口函数来解决这个问题的简单方法。我能想到的最简单的事情就是使用OUTER APPLY

代码语言:javascript
运行
复制
SELECT  TT.ID, TT.Name, TT.ItemID, TT.VisitDate, X.VisitDate
FROM mytable AS TT  
OUTER APPLY (
  SELECT TOP 1 VisitDate
  FROM mytable AS T
  WHERE T.ID = TT.ID AND T.VisitDate < TT.VisitDate
  ORDER BY T.VisitDate DESC) AS X
票数 1
EN

Stack Overflow用户

发布于 2018-03-10 02:51:16

我使用密集等级得到了它:

代码语言:javascript
运行
复制
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

结果:

代码语言:javascript
运行
复制
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-01
票数 0
EN

Stack Overflow用户

发布于 2018-03-10 02:51:29

我想这样就行了。

代码语言:javascript
运行
复制
declare @t table(ID int, Name varchar(10), ItemID int,  VisitDate 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');
select *  
     , (select max(VisitDate) from @t td where td.VisitDate < t.VisitDate) as dd
from @t t 
order by t.VisitDate;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49199989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档