从不同行和不同列中选择数据

时间:2017-02-25 05:49:42

标签: sql-server sql-server-2008 sql-server-2012

我想选择具有以下条件的所有条目:下一行的开始日期应该是前一行的结束日期的少于1个月即(Startdate(第i行)< Enddate(第i-1行))对于相同的' GpID'和'客户ID'。

例如,在下面的屏幕截图中,包含[ClientGPID] = 2的行无效,因为Startdate[ClientGPID] = 2> 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

1 个答案:

答案 0 :(得分:0)

在您提供的示例数据中(只有三行),没有一行是有效的。第一行没有前导,第二行无效,因为它的StartDate值高于前一行的EndDate值,第三行也是如此(尽管是5秒)

同样,我认为这可能会对你有所帮助:

;WITH CTE AS
(
    SELECT
         *
        ,LAG(EndDate) OVER (ORDER BY ClientGPID) AS X
    FROM Client_GP
)
SELECT 
     ClientGPID
    ,ClientID
    ,GpID
    ,Startdate
    ,Enddate
FROM CTE
WHERE StartDate < X
;

播放了一些示例数据,并按预期执行。

我在你的问题中唯一没有理解的是这一部分:

  

下一行的开始日期应该是少于1个月的结束日期   前一行

你的意思是“不到一个月”?

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