在取消任何交易后查找最高交易金额

Bar*_*ral 0 sql-server sql-server-2008

我有一个包含数百万笔交易的表.我需要找到收入最高的当前金额."当前"定义为最后一次取消的交易之后发生.表格如下:

Id (guid)    ServiceId   CreatedDate               AmountPaid    InsurerId   IsCanceled
76E9A3...    19          2013-08-30 12:34:01.580   56.00         96          0
C3F325...    19          2013-08-30 12:34:02.069   14.95         110         0
96E9A3...    19          2013-08-30 12:32:01.540   109.00        95          1
C3BC25...    19          2013-08-30 12:32:02.007   15.95         108         1
85E9A3...    19          2013-08-30 12:30:01.701   101.00        95          0
A3F325...    19          2013-08-30 12:30:02.069   13.95         108         0
Run Code Online (Sandbox Code Playgroud)

如您所见,对于相同的serviceID,我有多个事务.我需要在这里检索的是$ 56交易,因为同一ServiceID的最近取消交易之后,它是该ServiceId的最高交易.

如果我做:

 ORDER BY CreatedDate DESC, AmountPaid DESC
Run Code Online (Sandbox Code Playgroud)

第一行将是14.95美元的交易......

如果我做:

ORDER BY AmountPaid DESC, CreatedDate DESC
Run Code Online (Sandbox Code Playgroud)

第一行是101 $交易

更多信息:

取消服务交易后,任何交易都将失效.唯一有效的交易是在取消的交易之后创建的交易.

Aar*_*and 5

;WITH m AS
(
  SELECT ServiceID, m = MAX(CreatedDate) 
  FROM dbo.whatever 
  WHERE IsCanceled = 1 GROUP BY ServiceID
),
n AS
(
  SELECT w.*, 
    rn = ROW_NUMBER() OVER (PARTITION BY w.ServiceID ORDER BY w.AmountPaid DESC)
  FROM dbo.whatever AS w
  LEFT OUTER JOIN m ON w.ServiceID = m.ServiceID
  WHERE w.CreatedDate > COALESCE(m.m, '19000101')
)
SELECT * FROM n WHERE rn = 1;
Run Code Online (Sandbox Code Playgroud)