我尝试使用潜在客户声明将新日期的开始日期用作上一个结束日期
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
答案 0 :(得分:0)
我相信你的订单错了。它应该是:
select name_id, start as start, LEAD(start, 1,0 ) over(order by start) as end
答案 1 :(得分:0)
您的查询应该失败。我假设您的按日期排序实际上是按开始排序,并且您将结束列名称括起来,因为结尾是一个关键词并且抛出了错误的语法。除此之外,您的LEAD偏移应该是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
答案 2 :(得分:0)
你的问题中有很多误导性内容。
我刚从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(开始,1,0),因为default
应该是一个日期而你提供的是0这是一个数字
根据您想要的输出,您甚至无需指定offset
和default
。