我正在尝试使用lead语句来使用新日期的开始日期作为先前的结束日期
Name_id Pay Start
John1 $10 01-01-2011
John1 $11 01-05-2012
John1 $15 01-06-2014我想要的是:
Name_id Pay Start End
John1 $10 01-01-2011 01-05-2012
John1 $11 01-05-2012 01-06-2014
John1 $15 01-06-2014 NULL 我试过了
select name_id, start as start, LEAD(start, 1,0 ) over(order by date) as end
但我得到了
Name_id Pay Start End
John1 $10 01-01-2011 04-01-2011 //Random date??
John1 $11 01-05-2012 01-05-2012
John1 $15 01-06-2014 01-06-2014发布于 2017-10-03 04:16:36
我相信你的订单是错的。它应该是:
select name_id, start as start, LEAD(start, 1,0 ) over(order by start) as end发布于 2017-10-03 04:26:16
您的查询应该会失败。我假设order by date实际上是order by start,并且您将结束列名括起来,因为end是一个关键字,并抛出错误的语法。除此之外,您的前导偏移量应该是LEAD (开始,1,开始)。语法为LEAD ( scalar_expression,offset,default )。请参阅lead documentation here。您可能还希望按Name_id进行分区,假设您有多个名称,并且不希望一个名称的开始日期是另一个名称的结束日期。
下面是我用来测试的表变量。
DECLARE @tbl TABLE (
Name_id NVARCHAR(MAX),
Pay INT,
[Start] DATE
)
INSERT @tbl VALUES
('John1',10,'01-01-2011'),
('John1',11,'01-05-2012'),
('John1',15,'01-06-2014')下面是我用来测试的查询。
SELECT
[Name_id],
[Pay],
[Start],
LEAD([Start], 1, [Start]) OVER (PARTITION BY Name_id ORDER BY [Start]) AS [End]
FROM @tbl发布于 2017-10-03 04:26:28
你的问题中有很多误导性的东西。
我刚刚从LEAD中删除了偏移量和默认值,它的工作与预期的一样。您的示例查询是错误的,并且存在语法错误。
create table #tt (
Name_id varchar(10), Pay int, [Start] date
)
insert into #tt values
('John1', 10, '01-01-2011'),
('John1', 11, '01-05-2012'),
('John1', 15, '01-06-2014')
select Name_id, Pay, Start, LEAD([Start]) over(order by [Start]) as [End]
from #tt您不能说LEAD(Start,1,0),因为default应该是一个日期,而您提供的0是一个数字
对于您想要的输出,甚至不需要指定offset和default。
https://stackoverflow.com/questions/46532697
复制相似问题