主旨声明不正确

时间:2017-10-02 19:48:00

标签: sql-server

我尝试使用潜在客户声明将新日期的开始日期用作上一个结束日期

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

3 个答案:

答案 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这是一个数字

根据您想要的输出,您甚至无需指定offsetdefault