SQL将对应的重复行配对并计算两行之间的天数(SSMS)
我有一个表,其中包含针对抵押抵押品处理的不同类型的交易。我提供了一个报告解决方案,帮助用户确定两个独立事务之间的天数。我面临的挑战是,一组事务可能会发生多次,我不知道如何将一个事务与另一个对应的事务配对,并计算这两个事务之间的天数。例如,我有一个表,其中包含1个抵押品的交易,这些抵押品被多次返回和恢复。每次发生退货时,此表中都会过账一笔交易,恢复时也会过账:SQL将对应的重复行配对并计算两行之间的天数(SSMS),sql,sql-server-2008,tsql,Sql,Sql Server 2008,Tsql,我有一个表,其中包含针对抵押抵押品处理的不同类型的交易。我提供了一个报告解决方案,帮助用户确定两个独立事务之间的天数。我面临的挑战是,一组事务可能会发生多次,我不知道如何将一个事务与另一个对应的事务配对,并计算这两个事务之间的天数。例如,我有一个表,其中包含1个抵押品的交易,这些抵押品被多次返回和恢复。每次发生退货时,此表中都会过账一笔交易,恢复时也会过账: transaction type collateral transaction date reinstatement
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。感谢您提供此解决方案。尽管如此,我必须在查询中添加额外的逻辑。利用行号似乎有效。再次感谢。