2017-02-25 90 views
0

我想选择所有那些条目如下的条目:下一行的开始日期应该小于END的1个月END前一行的日期ie(Startdate(row i)< Enddate (行i-1))为相同的'GpID'和'客户id'。从不同的行和不同的列中选择数据

例如,在下面的屏幕截图,行与[ClientGPID] = 2是无效的,因为与[ClientGPID] = 2行的Startdate是行的> END date[ClientGPID] = 1为GPID = 67

CREATE TABLE [Client_GP] 
(
    [ClientGPID] [int] IDENTITY(1,1) NOT NULL, 
    [ClientID] [int] NOT NULL, 
    [GpID] [int] NOT NULL, 
    [Startdate] [datetime] NOT NULL, 
    [Enddate] [datetime] NULL 
) 
GO 

INSERT INTO [Client_GP] 
VALUES (67, 812, '2016-01-28 16:49:28.000', '2016-01-28 17:52:01.000'); 

INSERT INTO [Client_GP] 
VALUES(67, 812, '2017-02-24 16:49:28.000', '2017-02-24 17:52:01.000'); 

INSERT INTO [Client_GP] 
VALUES(67, 812, '2017-02-24 17:52:06.000', NULL); 

Example

+0

你能显示你想要的输出吗? –

回答

0

在该例子中数据您给(只有三行),没有行是有效的。第一行没有前任,第二行是无效的,因为它的StartDate值高于前一行的EndDate值,并且第三行(虽然是5秒)也是如此。

虽然如此,我认为这可以帮助你:

一些示例数据玩耍了,并进行预期。

我真的不明白你的问题的唯一的事情是这样的部分:

下一行开始时间应小于1个月 前一行的结束日期的

你是什么意思“不到1个月”?

如果因为这个原因我的答案不适合你,请告诉我你的意思,我可以给你一个完整的答案。

+0

我想他的意思是这样的..即兴对你的解答 ;具有CTE AS ( 选择 * ,DATEADD(MM,1,LAG(结束日期)OVER(PARTITION BY客户端ID,GPID ORDER BY ClientGPID)) AS X FROM Client_GP ) SELECT ClientGPID ,客户端ID ,GPID ,开始日期 ,结束日期 \t,X FROM CTE WHERE的StartDate Sam

+1

但值得一提的是,LAG只能在SQL Server 2012及更高版本中使用,而不能在2008年使用。对于2008,您可以使用此处提及的任何选项https://blog.sqlauthority.com/2011/11/24/sql-服务器解决方案拼图模拟铅和滞后没有使用sql-server-2012-analytic-function/ – Sam

+0

谢谢你3BK你的答案是正确的。山姆评论是我真正想要的答案。 –