Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL将对应的重复行配对并计算两行之间的天数(SSMS)_Sql_Sql Server 2008_Tsql - Fatal编程技术网

SQL将对应的重复行配对并计算两行之间的天数(SSMS)

SQL将对应的重复行配对并计算两行之间的天数(SSMS),sql,sql-server-2008,tsql,Sql,Sql Server 2008,Tsql,我有一个表,其中包含针对抵押抵押品处理的不同类型的交易。我提供了一个报告解决方案,帮助用户确定两个独立事务之间的天数。我面临的挑战是,一组事务可能会发生多次,我不知道如何将一个事务与另一个对应的事务配对,并计算这两个事务之间的天数。例如,我有一个表,其中包含1个抵押品的交易,这些抵押品被多次返回和恢复。每次发生退货时,此表中都会过账一笔交易,恢复时也会过账: transaction type collateral transaction date reinstatement

我有一个表,其中包含针对抵押抵押品处理的不同类型的交易。我提供了一个报告解决方案,帮助用户确定两个独立事务之间的天数。我面临的挑战是,一组事务可能会发生多次,我不知道如何将一个事务与另一个对应的事务配对,并计算这两个事务之间的天数。例如,我有一个表,其中包含1个抵押品的交易,这些抵押品被多次返回和恢复。每次发生退货时,此表中都会过账一笔交易,恢复时也会过账:

transaction type    collateral  transaction date
reinstatement       123         11/24/2013
returned            123         11/21/2013
reinstatement       123         1/2/2013
returned            123         1/1/2013
规则1:返回的交易必须在恢复后进行

规则2:两个对应的事务之间没有链接关系

结果:

collateral  days between transactions
123         1
123         3

目前,我必须运行所有返回和恢复事务的提取,然后手动配对每个事务,然后计算其间的天数。任何人都有可能在SQL中包含此逻辑的解决方案吗?我目前正在使用SQL Server 2008。谢谢大家!

这不是最漂亮的查询,我也没有大量的测试数据,但这将通过您提供的数据满足您的需求:

--Test Data
CREATE TABLE MORTGAGE (transactionType VARCHAR(20),collateral INT, transactionDate DATETIME)

INSERT INTO MORTGAGE VALUES('reinstatement',123,'Nov 24 2013')
INSERT INTO mortgage VALUES('returned',123,'Nov 21 2013')
INSERT INTO mortgage VALUES('reinstatement',123,'Jan 2 2013')
INSERT INTO mortgage VALUES('returned',123,'Jan 1 2013')

--Query
SELECT res1.collateral
     , DATEDIFF(DAY,res1.transactiondate,res2.transactiondate) AS [days between transactions]
FROM
    (SELECT TOP 100 PERCENT 
        TRANSACTIONTYPE, 
        COLLATERAL, 
        TRANSACTIONDATE
        ,ROW_NUMBER () over (partition by transactiontype order by transactiondate) artificialid
     FROM MORTGAGE 
     WHERE TRANSACTIONTYPE='returned'
     ORDER BY transactionDate) res1
INNER JOIN
    (SELECT TOP 100 PERCENT
        TRANSACTIONTYPE, 
        COLLATERAL, 
        TRANSACTIONDATE
        ,ROW_NUMBER () over (partition by transactiontype order by transactiondate) artificialid
     FROM MORTGAGE mret
     WHERE TRANSACTIONTYPE='reinstatement'
     ORDER BY transactionDate) res2
ON res1.artificialid = res2.artificialid
AND res1.TRANSACTIONDATE <> res2.TRANSACTIONDATE 
AND res1.TRANSACTIONDATE <> res2.TRANSACTIONDATE 

--Results
collateral  days between transactions
123         1
123         3

@麦克…非常感谢你的解决方案。我一定会试试这个。@Mack…非常感谢您提供这个解决方案。我将尝试这一点,并提供评论。再次感谢你!别忘了告诉我们答案是否解决了您的问题。@Mack。感谢您提供此解决方案。尽管如此,我必须在查询中添加额外的逻辑。利用行号似乎有效。再次感谢。