查询以递归方式将记录与前一个记录进行比较

时间:2014-08-20 13:13:11

标签: sql sql-server sql-server-2008-r2 common-table-expression recursive-query

我有以下表格样本

CREATE TABLE [dbo].[Transactions](
    [TransactionID] [int] IDENTITY(1,1) NOT NULL,
    [TransactionTypeID] [int] NOT NULL,
    [Counter] [int] NOT NULL,
    [GivenCounter] [int] NOT NULL,
    [ExecutionDate] [datetime] NOT NULL,
 CONSTRAINT [PK_Transactions] PRIMARY KEY CLUSTERED ([TransactionID] ASC)

TransactionTypeID字段标识交易类型:

  • 1表示激活
  • 2表示消费
  • 3表示取消

特别是type 3指的是取消之前的交易。因此,如果在取消之前执行的交易(就ExecutionDate而言)是type 2意味着取消消费而前一交易是type 1意味着取消是活化。

如何仅查询意义为停用的交易(type 3与之前的type 1)? 有人可以帮忙吗?

编辑:添加了一些示例数据以便更好地解释

TransactionID   TransactionTypeID   Counter  GivenCounter    ExecutionDate  
--------------  -----------------   -------  ------------    -----------------------
138327              1               1          0             2014-07-20 07:14:08.000
134175              2               0          1             2014-07-21 12:39:12.000
137620              3               1          1             2014-07-22 20:19:06.000
134199              1               1          0             2014-07-23 10:09:52.000
132772              3               0          1             2014-07-24 08:18:23.000

在此示例中,我的查询应仅提取一条记录(TransactionID 132772),因为它取消了TransactionTypeID等于1的先前交易

2 个答案:

答案 0 :(得分:1)

我会做这样的事情:

SELECT a.transactionid 
FROM   (SELECT *, Row_number() OVER(ORDER BY ExecutionDate) AS Rownumber 
        FROM   transactions) a 
       JOIN (SELECT transactiontypeid, Row_number()  OVER( ORDER BY ExecutionDate) AS Rownumber 
             FROM   transactions) b 
         ON a.rownumber = b.rownumber + 1 
WHERE  a.transactiontypeid = 1 
       AND b.transactiontypeid = 3 

答案 1 :(得分:-1)

我已经更新了我的答案,你能试试吗?

SELECT *
FROM
(
SELECT 
DENSE_RANK() OVER (PARTITION BY (TransactionTypeID) ORDER BY (ExecutionDate)) AS 'RowNo',
TransactionID, TransactionTypeID, ExecutionDate
FROM dbo.Transactions2
WHERE TransactionTypeID = 3
 ) AS A
WHERE RowNo = 2;