2017-02-25 93 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你的答案是正確的。山姆評論是我真正想要的答案。 –