Sql 选择新列中某列的下一次后续更改

Sql 选择新列中某列的下一次后续更改,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我有一个表格,上面有一个关于住家客户合同的唯一索引。我想知道每栋房子的天数,当有人搬出去(合同结束日期)和新合同开始时需要多长时间。为此,我想知道该房屋的下一份合同是什么,但与针对(可能不同)客户的旧合同在同一行 这就是表格当前的样子,我在这里选择前10名: SELECT TOP 10 PMCCONTRACT.ACCOUNTNUM --Customer ,PMCCONTRACT.RENTALOBJECTID --House ,PMCCONTRACT.CONTRACTID --Contract

我有一个表格,上面有一个关于住家客户合同的唯一索引。我想知道每栋房子的天数,当有人搬出去(合同结束日期)和新合同开始时需要多长时间。为此,我想知道该房屋的下一份合同是什么,但与针对(可能不同)客户的旧合同在同一行

这就是表格当前的样子,我在这里选择前10名:

SELECT TOP 10
PMCCONTRACT.ACCOUNTNUM  --Customer
,PMCCONTRACT.RENTALOBJECTID --House
,PMCCONTRACT.CONTRACTID --Contract & Unique index of the table
,PMCCONTRACT.VALIDFROM  --Contract Start Date
,PMCCONTRACT.VALIDTO    --Contract End Date
FROM PMCCONTRACT
然后推出:

ACCOUNTNUM  RENTALOBJECTID  CONTRACTID  VALIDFROM               VALIDTO
101852      2488            HC000001    1994-03-01 00:00:00.000 NULL
101136      2489            HC000002    1920-01-01 00:00:00.000 NULL
101352      2491            HC000003    1996-09-16 00:00:00.000 NULL
100687      2492            HC000004    1984-11-01 00:00:00.000 NULL
105160      2499            HC000005    1975-05-02 00:00:00.000 2018-01-31 00:00:00.000
102821      2501            HC000006    1997-09-16 00:00:00.000 NULL
100731      2506            HC000007    1920-01-01 00:00:00.000 2018-11-15 00:00:00.000
102797      2508            HC000008    1998-02-01 00:00:00.000 NULL
102155      2512            HC000009    1981-09-01 00:00:00.000 NULL
102563      2515            HC000010    1965-10-17 00:00:00.000 2017-06-30 00:00:00.000
我想要的是,基于RENTALOBJECTID,它将显示该房屋的第一份下一份合同是什么(因此合同在本表中保持唯一性很重要)

下面是我用来获取它的代码,但是,它显示了特定RENTALOBJECTID(House)的所有以下合同更改

这是当我只选择压缩HC000028时得到的结果,它显示2行,而我希望它只显示第一行

CONTRACTID  RENTALOBJECTID  VALIDFROM               VALIDTO                 FirstNextContractId VALIDFROM2              VALIDTO2
HC000028    75              1995-01-01 00:00:00.000 2016-04-30 00:00:00.000 HC009990            2016-05-01 00:00:00.000 2018-11-25 00:00:00.000 --<< Only row I want to show
HC000028    75              1995-01-01 00:00:00.000 2016-04-30 00:00:00.000 HC025218            2018-11-26 00:00:00.000 1900-01-01 00:00:00.000 --Too far in the future
constract RENTALOBJECTID VALIDFROM VALIDTO first nextconstract VALIDFROM 2 validt2
HC000028 75 1995-01-01 00:00:00.000 2016-04-30 00:00:00.000 HC009990 2016-05-01 00:00:00.000 2018-11-25 00:00:00:00.000--看起来一个简单的窗口功能就足够了。它返回由分区和排序子句定义的下一行

SELECT TOP 10
    PMCCONTRACT.ACCOUNTNUM  --Customer
    ,PMCCONTRACT.RENTALOBJECTID --House
    ,PMCCONTRACT.CONTRACTID --Contract & Unique index of the table
    ,PMCCONTRACT.VALIDFROM  --Contract Start Date
    ,PMCCONTRACT.VALIDTO    --Contract End Date
    ,LEAD(CONTRACTID) OVER (PARTITION BY RENTALOBJECTID ORDER BY VALIDFROM) AS NextContractID
    ,LEAD(VALIDFROM)  OVER (PARTITION BY RENTALOBJECTID ORDER BY VALIDFROM) AS NextVALIDFROM
    ,LEAD(VALIDTO)    OVER (PARTITION BY RENTALOBJECTID ORDER BY VALIDFROM) AS NextVALIDTO
FROM PMCCONTRACT
;

打扰一下Sql server 2012,已更新。
SELECT TOP 10
    PMCCONTRACT.ACCOUNTNUM  --Customer
    ,PMCCONTRACT.RENTALOBJECTID --House
    ,PMCCONTRACT.CONTRACTID --Contract & Unique index of the table
    ,PMCCONTRACT.VALIDFROM  --Contract Start Date
    ,PMCCONTRACT.VALIDTO    --Contract End Date
    ,LEAD(CONTRACTID) OVER (PARTITION BY RENTALOBJECTID ORDER BY VALIDFROM) AS NextContractID
    ,LEAD(VALIDFROM)  OVER (PARTITION BY RENTALOBJECTID ORDER BY VALIDFROM) AS NextVALIDFROM
    ,LEAD(VALIDTO)    OVER (PARTITION BY RENTALOBJECTID ORDER BY VALIDFROM) AS NextVALIDTO
FROM PMCCONTRACT
;